如何使用鼠标选择QTabBar中选项卡的文本?
可以像下面描述的那样选择QLabel中的文本:Make QLabel text selectable?,但我还没有为QTabBar选项卡文本找到类似的方法来执行此操作。
可以在这里找到QTabBar的文档:https://doc.qt.io/qt-5/qtabbar.html。它多次提到"select“,但这些实例都与选择文本无关。相反,它们都需要自己选择选项卡。
发布于 2020-10-06 19:58:17
Qt本身并不建议让QTabBar文本可选。
但是,它们允许您使用QTabBar::setTabButton将自己的小部件添加到选项卡本身。然后,您可以创建不带标题的选项卡(""),然后添加一个带有标题的QLabel并使其可选。请注意,单击QLabel本身并不会更改当前选项卡,您需要手动处理(在下面的示例代码中完成)。
下面是一个有效的示例代码(可以选择活动和非活动选项卡的文本):
#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();
}现在可以选择选项卡标题:

https://stackoverflow.com/questions/64164454
复制相似问题