我通过QLineEdit动态插入标签,效果很好。为了填充整个屏幕宽度(800像素),我正在使用自己的eventFilter扩展标签页:

tabs.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;
};


tabs.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像素。添加一个新的选项卡工作正常,但是resize事件使尺寸混乱。可以说我要添加第二个标签,在第一个标签旁边显示800px,而不是在800px(每个400/400 px)内缩放两个标签。

看起来像这样:
wrong insertion

实际上何时应如下所示:
how it's supposed to be

我在这里做错了什么?

最佳答案

您正在选项卡上而不是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*/
    }
};

关于c++ - 动态扩展QTabBar,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37697666/

10-10 21:30