C++ 在QTabWidget上使用setWindowModified()

C++ 在QTabWidget上使用setWindowModified(),c++,qt,qt5,qtabwidget,C++,Qt,Qt5,Qtabwidget,因为QTabWidget继承了QWidget我们有setWindowModified()可用。 但它似乎不适用于选项卡标题: ui->tab1->setWindowTitle(QString("%1[*]").arg(tr("Tab title"))); ui->tab1->setWindowModified(true); 但它既不显示“*”也不更改选项卡文本。 是否有一种方法可以自动处理此问题,而不是手动使用setTabText()?我认为默认情况下没有任何方法可以使

因为
QTabWidget
继承了
QWidget
我们有
setWindowModified()
可用。 但它似乎不适用于选项卡标题:

ui->tab1->setWindowTitle(QString("%1[*]").arg(tr("Tab title")));
ui->tab1->setWindowModified(true);
但它既不显示“*”也不更改选项卡文本。
是否有一种方法可以自动处理此问题,而不是手动使用
setTabText()

我认为默认情况下没有任何方法可以使选项卡文本跟随小部件标题。话虽如此,通过重写应该很容易修复

class选项卡_小部件:公共QTabWidget{
使用super=QTabWidget;
使用这个类=选项卡小部件;
公众:
使用super::super;
受保护的:
虚拟空选项卡插入(整数索引)覆盖
{
super::tabInserted(索引);
if(auto*w=widget(索引)){
连接(w,&QWidget::windowTitleChanged,this,&this\u class::handle\u window\u title\u change);
}
}
虚拟空选项卡已删除(整数索引)覆盖
{
super::tabRemoved(索引);
if(auto*w=widget(索引)){
断开连接(w,&QWidget::windowTitleChanged,this,&this\u class::handle\u window\u title\u change);
}
}
私人:
无效句柄\窗口\标题\更改(常量字符串和标题)
{
if(auto*w=qobject_cast(sender())){
setTabText(indexOf(w),title);
}
}
};

使用上面的类而不是
QTabWidget
应该会导致选项卡文本镜像与该选项卡关联的小部件的标题。

我认为默认情况下没有任何方法使选项卡文本跟随小部件标题。话虽如此,通过重写应该很容易修复

class选项卡_小部件:公共QTabWidget{
使用super=QTabWidget;
使用这个类=选项卡小部件;
公众:
使用super::super;
受保护的:
虚拟空选项卡插入(整数索引)覆盖
{
super::tabInserted(索引);
if(auto*w=widget(索引)){
连接(w,&QWidget::windowTitleChanged,this,&this\u class::handle\u window\u title\u change);
}
}
虚拟空选项卡已删除(整数索引)覆盖
{
super::tabRemoved(索引);
if(auto*w=widget(索引)){
断开连接(w,&QWidget::windowTitleChanged,this,&this\u class::handle\u window\u title\u change);
}
}
私人:
无效句柄\窗口\标题\更改(常量字符串和标题)
{
if(auto*w=qobject_cast(sender())){
setTabText(indexOf(w),title);
}
}
};
使用上述类而不是
QTabWidget
应该会导致选项卡文本镜像与该选项卡关联的小部件的标题

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);
      }
    }
};