Qt TabWidget选项卡在运行时重命名 我使用Visual Studio 2010和Qt;C++:p>

Qt TabWidget选项卡在运行时重命名 我使用Visual Studio 2010和Qt;C++:p>,c++,qt,computer-science,qt-designer,C++,Qt,Computer Science,Qt Designer,一切都是通过代码完成的。我没有访问Qt Designer的权限 我的问题是: 我正在开发一个名为EasyPaint的开源软件。 我试图实现一个选项卡重命名当用户双击选项卡时,他可以在运行时重命名它 为此,我使用了eventFilter: bool MainWindow::eventFilter(QObject *obj, QEvent *event){ if (obj == mTabWidget && event->type() == QEvent:

一切都是通过代码完成的。我没有访问Qt Designer的权限

我的问题是:

我正在开发一个名为EasyPaint的开源软件。 我试图实现一个选项卡重命名当用户双击选项卡时,他可以在运行时重命名它

为此,我使用了eventFilter:

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

您可以在上一个函数的最后一行找到installEventFilter

程序运行良好。从来没有错误。但是,我无法在双击时更改选项卡的名称

对于这一行代码:

mTabWidget->installEventFilterthis

我还尝试使用installEventFiltermtabWidget,但没有成功


感谢您的帮助。

如果您想在双击选项卡栏时捕获事件,您应该在选项卡小部件的QTabar上安装事件过滤器。但是QTabWidget::tabBar受保护,您无法访问它。解决方案是从QTabWidget派生一个类,并实现一个公共函数,该函数返回指向QTabBar的指针:

您的事件筛选器应类似于:

bool MainWindow::eventFilter(QObject *obj, QEvent *event){
    if (obj == mTabWidget->getTabBar() &&
        event->type() == QEvent::MouseButtonDblClick) {

        ...

我建议您使用到QTabWidget::tabBarDoubleClicked插槽的简单连接。它已经存在了,您根本不需要事件过滤器。这将导致更简单、更干净的实施:

connect(myTabWidget, &QTabWidget::tabBarDoubleClicked,
        myWindow, &MyWindow::onTabBarDoubleClicked);


双击后是否显示重命名对话框?否该对话框未显示@TAY2510您是否调试了事件过滤器以查看它是否被调用?当您双击选项卡栏时,是否希望它起作用?@Bowdzone。我在EventFilter函数上插入了一个断点。当mTabWidget->installEventFilterthis未注释时,软件会在运行前中断。它不会运行,断点会打断它,当我注释它不再是代码的一部分时,程序会在eventfilter函数上使用断点正常运行如果你对QTabWidget子类化,你也可以在这里而不是在主窗口中处理双击重命名。似乎是一个更清洁的解决方案me@Bowdzone你是对的。这是另一种实现它的方法,看起来不错。@Bowdzone上面的代码对我不起作用,我创建了一个新类,并实现了类cutomTab..上面.h文件中的第一块代码my.cpp是空的。现在,当我返回MainWindow.cpp并尝试编写mTabWidget->getTabBar时,它不允许met,它找不到getTabBar..您是否确保您使用的tabwidget是您的自定义选项卡小部件,而不是默认的QTabWidget?@Andrefarh您的类成员mTabWidget的类型应为customTab。您应该拥有customTab mTabWidget;在MainWindow.h.中,QTabWidget没有这样的信号,这是我在运行时得到的错误,并且它不在Qt文档中。请指定您使用的是哪个Qt版本?该信号从Qt5.2开始引入,我使用的是4.8。有其他选择吗?很抱歉,没有首先询问您有关版本的问题。我会在他的案例中使用子类化的方法,我自己可能会添加类似的信号。你能看看下面的解决方案吗,来自Nejat。我试着这么做,我首先在MainWindow.cpp内部实现了这个类,但它不起作用,所以我添加了一个新的customTab.h文件,并复制了Nejat在那里的内容,然后我回到MainWindow,在那里我试图编写Nejat提供的事件过滤器,我在mTabWidget->gettabar->mTabWidget的列表gettabar中没有红色下划线
mTabWidget->getTabBar()->installEventFilter(this);
bool MainWindow::eventFilter(QObject *obj, QEvent *event){
    if (obj == mTabWidget->getTabBar() &&
        event->type() == QEvent::MouseButtonDblClick) {

        ...
connect(myTabWidget, &QTabWidget::tabBarDoubleClicked,
        myWindow, &MyWindow::onTabBarDoubleClicked);
void MyWindow::onTabBarDoubleClicked(int index)
{
    // Code to rename the index-th tab here

    // Example:
    myTabWidget->setTabText(index, "some nice text");
}