如何在Qt中固定标签

如何在Qt中固定标签,qt,qtabbar,Qt,Qtabbar,是否可以用Qt固定卡舌 我希望一个选项卡始终保持在原位(索引0),同时仍然能够移动其他选项卡 到目前为止,我试图听QTabBar::tabMoved并恢复移动,但为时已晚。我甚至不想让它动 对我来说,最糟糕的情况是被迫改变鼠标操作方式。如果还有别的办法,请告诉我。我从来没有找到一个好办法。但是,我使用了这样一个事实,即您可以将原始数据存储在qtabar中,以固定选项卡,如果是固定的选项卡,则撤消移动。它并不完美,我仍然有一些丑陋的行为,但我也不想使用鼠标事件 首先,创建一个结构来存储选项卡的当前

是否可以用Qt固定卡舌

我希望一个选项卡始终保持在原位(索引0),同时仍然能够移动其他选项卡

到目前为止,我试图听QTabBar::tabMoved并恢复移动,但为时已晚。我甚至不想让它动


对我来说,最糟糕的情况是被迫改变鼠标操作方式。如果还有别的办法,请告诉我。

我从来没有找到一个好办法。但是,我使用了这样一个事实,即您可以将原始数据存储在
qtabar
中,以固定选项卡,如果是固定的选项卡,则撤消移动。它并不完美,我仍然有一些丑陋的行为,但我也不想使用鼠标事件

首先,创建一个结构来存储选项卡的当前状态:

struct PinnedTab
{
    bool isPinned;
    int currentIndex;
};

Q_DECLARE_METATYPE(PinnedTab); // For QVariant
然后,创建一个自定义的
QTabBar
来处理移动,并使用
QTabWidget
替换当前选项卡栏(插入选项卡之前必须这样做):

类栏:公共qtabar
{
公众:
无效pin(整型常量索引)
{
PinnedTab信息;
info.isPinned=true;
info.currentIndex=index;//TODO:将选项卡向左移动,不使用当前索引
setTabData(索引,QVariant::fromValue(info));
}
条形图(QWidget*parent=nullptr):qtabar(parent)
{}
虚拟void tabLayoutChange()覆盖
{
对于(int i=0;i!=count();++i)//检查固定的选项卡是否已移动
{
if(tabData(i).isValid())
{
PinnedTab const info=tabData(i).value();
if(info.isPinned==true&&i!=info.currentIndex){
回滚布局();
返回;
}
}
}
对于(int i=0;i!=count();++i)
{
if(tabData(i).isValid())
{
PinnedTab info=tabData(i).value();
info.currentIndex=i;
setTabData(i,QVariant::fromValue(info));
}
其他的
{
PinnedTab信息;
info.ispined=false;
info.currentIndex=i;
setTabData(i,QVariant::fromValue(info));
}
}
}
void rollbackLayout(){
对于(int i=0;i!=count();++i)
{
if(tabData(i).isValid())
{
PinnedTab const info=tabData(i).value();
如果(i!=info.currentIndex){
moveTab(i,信息当前索引);
}
}
}
}
};
布局发生更改时,将调用
tabLayoutChange
。因此,当您移动选项卡时将调用它

rollbackLayout
方法用于将每个选项卡移动到选项卡数据中存储的最后一个位置

调用
pin
锁定具有给定索引的选项卡

为了更加清晰,我简化了代码,您可能需要重新定义一些行为(目前,如果您固定选项卡,它将保持其当前位置,并且不会处理插入/删除选项卡)

class Bar: public QTabBar
{
public:
    void pin(int const index)
    {
        PinnedTab info;
        info.isPinned = true;
        info.currentIndex = index; // TODO: move the tab to the left and do not use current index
        setTabData(index, QVariant::fromValue(info));
    }

    Bar(QWidget* parent=nullptr): QTabBar(parent)
    {}

    virtual void tabLayoutChange() override
    {
        for (int i = 0; i != count(); ++i) // Check if a pinned tab has moved
        {
            if (tabData(i).isValid())
            {
                PinnedTab const info = tabData(i).value<PinnedTab>();
                if (info.isPinned == true && i != info.currentIndex) {
                    rollbackLayout();
                    return;
                }
            }
        }

        for (int i = 0; i != count(); ++i)
        {
            if (tabData(i).isValid())
            {
                PinnedTab info = tabData(i).value<PinnedTab>();
                info.currentIndex = i;
                setTabData(i, QVariant::fromValue(info));
            }
            else
            {
                PinnedTab info;
                info.isPinned = false;
                info.currentIndex = i;
                setTabData(i, QVariant::fromValue(info));
            }
        }
    }

    void rollbackLayout() {
        for (int i = 0; i != count(); ++i)
        {
            if (tabData(i).isValid())
            {
                PinnedTab const info = tabData(i).value<PinnedTab>();
                if (i != info.currentIndex) {
                    moveTab(i, info.currentIndex);
                }
            }
        }
    }
};