【问题标题】:Show asterisk on changes of a QTabWidget在 QTabWidget 的更改上显示星号
【发布时间】:2015-05-07 12:38:50
【问题描述】:

我正在创建一个多文件文本编辑器,使用标签来编辑不同的文件。 为此,我使用了一个 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 专业版

Qt 5.3.2

【问题讨论】:

    标签: qt qtabwidget qplaintextedit


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答!由于缺少功能,我已经将 QPlainTextEdit 子类化,但没有在这里写,因为它只会增加示例。指向 tabwidget 的“父”指针是个好主意,经过漫长的一天我没有想到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多