2015-05-07 3 views
0

Я создаю многострочный текстовый редактор, используя вкладки для редактирования различных файлов. Для этого я использую 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

ответ

1

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

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

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

+0

Спасибо за ответ! Я уже подклассифицировал QPlainTextEdit из-за отсутствия функций, но не писал это здесь, так как это только увеличило бы пример. «Родительский» указатель на tabwidget - хорошая идея, после долгого дня я об этом не думал. – Burner

Смежные вопросы