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