Qt TabWidget选项卡在运行时重命名

时间:2014-11-19 05:48:29

标签: c++ qt computer-science qt-designer

我在Visual Studio 2010和Qt中使用C ++;

一切都是通过代码完成的。我无法访问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);
}

在实现eventFilter之后,我尝试在选项卡上调用install it,如下所示:

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)而没有运气

谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

如果要在双击标签栏时捕获事件,则应在选项卡小部件的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) {

        ...

答案 1 :(得分:2)

我建议您使用与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");
}