Показать звездочку об изменениях 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

1 ответ

Есть несколько способов упростить этот код. Например, вы можете использовать QPlainTextEdit::textChanged сигнал вместо QTextDocument::contentsChanged, Если вы сделаете это, вы получите QPlainTextEdit после динамического приведения, и вы сможете использовать QTabWidget::indexOf сразу без итерации.

Также вы можете предположить, что пользователь не может редактировать что-либо на неактивной вкладке, поэтому вы можете просто использовать QTabWidget::currentIndex,

Однако иногда сложнее лучше, чем упрощено. Я предполагаю, что ваш редактор будет иметь некоторые функции, и его поведение будет отличаться от простого QPlainTextEdit, Может быть хорошо создать класс, представляющий содержимое вкладки. Вы можете либо получить из QPlainTextEdit или создайте другой класс формы, который содержит QPlainTextEdit и, возможно, будет содержать больше виджетов в будущем. Затем вы можете поместить всю логику, связанную с одним редактором, в этот класс, поэтому он также должен решить, какой заголовок должен отображаться для него. Класс должен иметь указатель на виджет главной формы или вкладки и может легко вычислять свой собственный индекс в виджете вкладки, чтобы он мог переименовывать свою вкладку без использования sender(),

Другие вопросы по тегам