在QTabWidget上使用setWindowModified()

时间:2019-01-23 13:13:25

标签: c++ qt qt5 qtabwidget

因为QTabWidget继承了QWidget,所以我们有setWindowModified()可用。 但是看来该选项卡标题不起作用:

ui->tab1->setWindowTitle(QString("%1[*]").arg(tr("Tab title")));
ui->tab1->setWindowModified(true);

,但不显示“ *”,也不更改标签文本。 有没有一种方法可以自动处理此问题,而不是手动使用setTabText()

1 个答案:

答案 0 :(得分:2)

我认为默认情况下没有任何方法可以使标签文本跟随小部件标题。话虽如此,通过覆盖QTabWidget::tabInserted来解决问题应该非常容易。

class tab_widget: public QTabWidget {
  using super      = QTabWidget;
  using this_class = tab_widget;
public:
  using super::super;
protected:
  virtual void tabInserted (int index) override
    {
      super::tabInserted(index);
      if (auto *w = widget(index)) {
        connect(w, &QWidget::windowTitleChanged, this, &this_class::handle_window_title_change);
      }
    }
  virtual void tabRemoved (int index) override
    {
      super::tabRemoved(index);
      if (auto *w = widget(index)) {
        disconnect(w, &QWidget::windowTitleChanged, this, &this_class::handle_window_title_change);
      }
    }
private:
  void handle_window_title_change (const QString &title)
    {
      if (auto *w = qobject_cast<QWidget *>(sender())) {
        setTabText(indexOf(w), title);
      }
    }
};

使用上述类而不是QTabWidget会导致选项卡文本反映与该选项卡关联的窗口小部件的标题。