Я создаю многострочный текстовый редактор, используя вкладки для редактирования различных файлов. Для этого я использую QTabWidget, который содержит виджеты QPlainTextEdit, где пользователь может редактировать текст. Если пользователь редактирует текст в QPlainTextEdit, я хочу изменить заголовок закладки, добавив звездочку (*), чтобы показать ему, что в этом файле содержатся несохраненные изменения.Показать звездочку об изменениях QTabWidget
Мое текущее решение заключается в следующем:
Добавить новую вкладку в 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 из-за отсутствия функций, но не писал это здесь, так как это только увеличило бы пример. «Родительский» указатель на tabwidget - хорошая идея, после долгого дня я об этом не думал. – Burner