Qt TabWidget Tab 在运行时重命名

Qt TabWidget Tab rename in runtime

本文关键字:运行时 重命名 Tab TabWidget Qt      更新时间:2023-10-16

>我正在将C++与Visual Studio 2010和Qt一起使用;

一切都是通过代码完成的。我无法访问Qt Designer。

我的问题是:

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

为此,我使用了一个事件过滤器:

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

实现事件过滤器后,我尝试在选项卡上调用安装它,如下所示:

void MainWindow::initializeTabWidget() {
mTabWidget = new QTabWidget();
mTabWidget->setUsesScrollButtons(true);
mTabWidget->setTabsClosable(true);
mTabWidget->setMovable(true);
connect(mTabWidget, SIGNAL(currentChanged(int)), this, SLOT(activateTab(int)));
connect(mTabWidget, SIGNAL(currentChanged(int)), this, SLOT(enableActions(int)));
connect(mTabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int)));
setCentralWidget(mTabWidget);
mTabWidget->installEventFilter(this);

}

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

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

对于这行代码:

mTabWidget->installEventFilter(this);

我也尝试使用installEventFilter(mtabWidget)代替,但没有运气

谢谢你的帮助。

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

#include <QTabBar>
#include <QTabWidget>

class customTab: public QTabWidget
{
    Q_OBJECT
public:
    customTab(QObject *parent = 0) :
    QTabWidget((QWidget *)parent)
    {
    }
    ~customTab(){}
    QTabBar *getTabBar()
    {
        return this->tabBar();
    } 
};

现在你可以在标签栏上安装事件过滤器(mTabWidgetcustomTab的实例):

mTabWidget->getTabBar()->installEventFilter(this);

您的事件过滤器应如下所示:

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

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

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