0

QLineEdit を介してタブを動的に挿入していますが、これは正常に機能します。画面の幅全体 (800px) を埋めるために、独自の 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));
}

アプリの実行後、1 つのタブが常に表示され、正しく展開されます。前述のように、最大​​幅は 800 ピクセルに設定されています。新しいタブの追加は正常に機能していますが、サイズ変更イベントによって寸法が乱れます。両方のタブを 800 ピクセル (それぞれ 400 / 400 ピクセル) にスケーリングするのではなく、最初のタブの隣に 800 ピクセルを表示する 2 番目のタブを追加するとします。

次のようになります: 間違った挿入

実際にこのように見える場合: どのようにあるべきか

ここで何が間違っていますか?

4

1 に答える 1

2

QTabBar ではなく、タブでサイズを設定しています。したがって、サイズ変更が発生するまで、明らかに新しいタブは設定された幅になります。

と の両方を継承QTabBarして実装するだけで、冗長になります。resizeEventtabInsertedeventFilter

サンプルコード:

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*/
    }
};
于 2016-06-08T09:45:53.623 に答える