显示QTABWIDGET更改的星号



我正在创建一个使用选项卡的多帧文本编辑器,以编辑不同的文件。为此,我正在使用QTABWIDGET,该QTABWIDGET容纳用户可以编辑文本的QplaintExtedIt小部件。如果用户在qplaintExtedit中编辑文本,我想通过添加星号(*)来更改标题,以显示该文件中有未保存的更改。

我当前的解决方案是:

添加一个新标签到qtabwidget:

QPlainTextEdit* temp = new QPlainTextEdit("lots of text", this);
temp->setWindowTitle("the title of the tab");
connect(temp->document(), SIGNAL(contentsChanged()), this, SLOT(onTabContentChanged()));
mTabWidget->setCurrentIndex(mTabWidget->addTab(temp, temp->windowTitle()));

插槽以反应内容变化:

void MainWindow::onTabContentChanged(void) {
// Content of a tabbed QPlainTextedit has changed; find it and set it to modified
QTextDocument* tempDocument = dynamic_cast<QTextDocument*>(sender());
if(tempDocument) {
    for (int var = 0; var < mTabWidget->count(); ++var) {
        QPlainTextEdit* tempTextedit =  dynamic_cast<QPlainTextEdit*>(mTabWidget->widget(var));
            if(tempTextedit) {
                if(tempDocument == tempTextedit->document()) {
                    tempTextedit->setWindowModified(true);
                    mTabWidget->setTabText(mTabWidget->indexOf(tempTextedit), "add a * here");
                }
            }
    }
}

}

我认为使用sender()不好,这是不好的,这样做的努力/代码太多了,所以我感觉自己做错了,或者有一种更好的方法。

有什么想法?

使用:

win7 pro

QT 5.3.2

有多种简化此代码的方法。例如,您可以使用QPlainTextEdit::textChanged信号而不是QTextDocument::contentsChanged。如果这样做,您将在动态铸造后获得QPlainTextEdit,并且可以立即使用QTabWidget::indexOf而不迭代。

您也可以假设用户不能在非活动选项卡上编辑某些内容,因此您可以使用QTabWidget::currentIndex

但是,有时复杂的比简化要好。我认为您的编辑器将具有某些功能,其行为将与简单的QPlainTextEdit相同。创建代表标签内容的类可能是一件好事。您可以从QPlainTextEdit派生,也可以创建另一个包含QPlainTextEdit的表单类,并且将来可能包含更多的小部件。然后,您可以将所有与单个编辑器相关的逻辑放在此类中,因此它还应该确定应显示哪个标题。该类应具有指向主形式或标签小部件的指针,并且可以轻松地计算出自己的索引,以便在不使用sender()的情况下重命名其选项卡。

最新更新