首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在QTabBar中选择选项卡文本

在QTabBar中选择选项卡文本
EN

Stack Overflow用户
提问于 2020-10-02 07:35:00
回答 1查看 227关注 0票数 1

如何使用鼠标选择QTabBar中选项卡的文本?

可以像下面描述的那样选择QLabel中的文本:Make QLabel text selectable?,但我还没有为QTabBar选项卡文本找到类似的方法来执行此操作。

可以在这里找到QTabBar的文档:https://doc.qt.io/qt-5/qtabbar.html。它多次提到"select“,但这些实例都与选择文本无关。相反,它们都需要自己选择选项卡。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 19:58:17

Qt本身并不建议让QTabBar文本可选。

但是,它们允许您使用QTabBar::setTabButton将自己的小部件添加到选项卡本身。然后,您可以创建不带标题的选项卡(""),然后添加一个带有标题的QLabel并使其可选。请注意,单击QLabel本身并不会更改当前选项卡,您需要手动处理(在下面的示例代码中完成)。

下面是一个有效的示例代码(可以选择活动和非活动选项卡的文本):

代码语言:javascript
复制
#include <QApplication>
#include <QMainWindow>
#include <QTabWidget>
#include <QTabBar>
#include <QLabel>

#include <map>

class MainFrame : public QMainWindow
{
public:
    MainFrame()
    {
        tabWidget = new QTabWidget( this );
        setCentralWidget( tabWidget );

        addSelectableTab( new QLabel( "Hello World", tabWidget ), "foo" );
        addSelectableTab( new QLabel( "Hello World", tabWidget ), "bar" );
    }

    void addSelectableTab( QWidget* widget, const QString& title )
    {
        int index = tabWidget->addTab( widget, "" );

        QLabel* titleLabel = new QLabel( title );
        titleLabel->setTextInteractionFlags( Qt::TextSelectableByMouse );
        tabWidget->tabBar()->setTabButton( index, QTabBar::RightSide, titleLabel );

        tabLabels[titleLabel] = index;
        titleLabel->installEventFilter( this );
    }

    bool eventFilter(QObject *obj, QEvent *event) override
    {
        /** When using QLabel as tab title, current tab can only be changed by clicking outside
         *  the label...so let's detect when user clicked inside the label and then change current tab!
         */
        if ( event->type() == QEvent::MouseButtonRelease )
        {
            auto found = tabLabels.find( dynamic_cast<QLabel*>( obj ) );
            if ( found != tabLabels.end() )
            {
                if ( !found->first->hasSelectedText() )
                {
                    // suppose user clicked the label
                    tabWidget->setCurrentIndex( found->second );
                    return true;
                }
            }
        }

        return QMainWindow::eventFilter( obj, event );
    }

private:
    QTabWidget* tabWidget;

    // this is to know what tab should be activated when a label is clicked
    // you may get rid of that by using QTabBar::tabButton to identify what
    // tab a QLabel is related to
    std::map<QLabel*,int> tabLabels;
};

int main( int argc, char* argv[] )
{
    QApplication app(argc,argv);

    MainFrame wnd;
    wnd.show();
    return app.exec();
}

现在可以选择选项卡标题:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64164454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档