双击Qt选项卡时重命名



我正在使用Visual Studio和Qt。我无法访问Qt设计器。这一切都是通过编码完成的(C++);

我有一个名为EasyPaint的开源软件。

我在尝试重命名选项卡时遇到了困难。我希望能够在用户双击选项卡本身时重命名选项卡。

我创建了一个新函数来过滤 doubleClick 事件:

 bool MainWindow::eventFilter(QObject *obj, QEvent *event)
 `enter code here`{
     if (event->type() == QEvent::MouseButtonDblClick) {
         return true;
     } else {
         // standard event processing
         return QObject::eventFilter(obj, event);
     }
 }

然后我将这一行添加到初始化 TabWidget 的函数中:

installEventFilter(mTabWidget);

任何人都可以指导我完成这个。谢谢

很可能Qt不允许在选项卡名称上打开内联编辑器。 因此,您很可能必须创建并运行一个非常小的QDialog来查询新名称:

 bool MainWindow::eventFilter(QObject *obj, QEvent *event)
 {
    if (obj == mTabWidget &&
        event->type() == QEvent::MouseButtonDblClick) {
        // query and set tab(s) names
        QTabWidget *tab = qobject_cast<QTabWidget *>(obj);
        if(tab)
        {
            QDialog dlg;
            QVBoxLayout la(&dlg);
            QLineEdit ed;
            la.addWidget(&ed);
            QDialogButtonBox bb(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
            la.addWidget(&bb);
            dlg.setLayout(&la);
            if(dlg.exec() == QDialog::Accepted)
            {
                tab->setTabText(0, ed.text());
                return true;
            }
        }
    }
    // Standard event processing
    return QObject::eventFilter(obj, event);
}

可能是Qt的动态内存管理不喜欢本地类实例,所以你必须将所有创建的类实例转换为使用new创建的指针,但是请不要忘记告诉QDialog在关闭时删除或在查询新名称后调用dlg->deleteLater()

通过假内联编辑器解决此问题的另一种方法需要更多的工作:

  • 创建 QLineEdit
  • 将其
  • 移动到选项卡的正上方,将其放在前面并将键盘焦点设置为它
  • 有线信号和插槽
    • 按回车键应使用 QLineEdit 的内容
    • 从行编辑中离开焦点应被视为"中止"并删除行编辑器
  • 实施槽以执行所需的操作。

您可以以休光方式编写事件过滤器:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
     if (obj == mTabWidget &&
         event->type() == QEvent::MouseButtonDblClick) {
         QTabWidget *tab = qobject_cast<QTabWidget *>(obj);
         // Set tab(s) names         
         tab->setTabText(0, "New Name");
     }
     // Standard event processing
     return QObject::eventFilter(obj, event);
 }

最新更新