动态展开 QTabBar

Expand QTabBar dynamically

本文关键字:QTabBar 动态      更新时间:2023-10-16

我正在通过QLineEdit动态插入选项卡,这工作正常。为了填充屏幕的整个宽度(800px),我正在使用自己的eventFilter扩展选项卡:

标签.h

class ResizeFilter : public QObject
{
    QTabBar *target_tabs;
public:
    ResizeFilter(QTabBar *target_tabs) : QObject(target_tabs), target_tabs(target_tabs) {}
    bool eventFilter(QObject *object, QEvent *event)
    {
        if (object == target_tabs) {
            if (event->type() == QEvent::Resize)
            {
                // The width of each tab is the width of the tabbar / # of tabs.
                target_tabs).arg(target_tabs->size().width()/target_tabs->count()));
            }
        }
        return false;
    }
};
class tabs : public QWidget
{
    Q_OBJECT
private:
    QTabBar *cells;
};

选项卡.cpp

void tabs::changeTabs(int value)
{
    tabs->installEventFilter(new ResizeFilter(tabs));
    if (tabs->count() < value)
        tabs->insertTab(tabs->count(), QIcon(QString("")), QString::number(value));
}

运行应用程序后,一个选项卡始终可见并正确展开。如前所述,最大宽度设置为 800 像素。添加新选项卡工作正常,但调整大小事件会弄乱尺寸标注。假设我正在添加第二个选项卡,它在第一个选项卡旁边显示 800px,而不是在 800px(每个 400/400 px)内缩放两个选项卡。

它看起来像这样:插入错误

当它实际上应该看起来像这样时:它应该如何

我在这里做错了什么?

您是在选项卡上设置大小,而不是在 QTabBar 上设置大小。因此,很明显,新选项卡将采用设置的宽度,直到发生调整大小。

您可以只继承QTabBar并同时实现resizeEventtabInserted,这也使您的eventFilter变得多余。

示例代码:

class CustomTabBar : public QTabBar
{
public:
    CustomTabBar(QWidget *parent = Q_NULLPTR)
        : QTabBar(parent)
    {
    }
protected:
    void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE
    {
        /*resize handler*/
    }
    void tabInserted(int index) Q_DECL_OVERRIDE
    {
        /*new tab handler*/
    }
    void tabRemoved(int index) Q_DECL_OVERRIDE
    {
        /*tab removed handler*/
    }
};