带有动态变化小部件的 QTabWidget

Posted

技术标签:

【中文标题】带有动态变化小部件的 QTabWidget【英文标题】:QTabWidget with dynamic change widgets 【发布时间】:2013-06-20 15:16:00 【问题描述】:

我正在使用 QTabWidget(在 AbstractManagerTab 中组成的 pHTab)来显示一些数据 (IpTrafficPage 和 SpecTrafficPage 小部件), 我需要动态地将 QPushButtons 添加到添加的选项卡中。

当我启动应用程序时,添加的按钮仅在最后一个选项卡中可见。 有什么问题?

class AbstractTrafficPage : public QWidget

    Q_OBJECT
public:
    explicit AbstractTrafficPage(QWidget *parent = 0);
    void addCommandButton(QWidget *btn);
private:
    QVBoxLayout *commBtnsLayout;
;

AbstractTrafficPage::AbstractTrafficPage(QWidget *parent) :
    QWidget(parent),
    commBtnsLayout(new QVBoxLayout)

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addLayout(commBtnsLayout);
    mainLayout->addStretch();

    setLayout(mainLayout);


void AbstractTrafficPage::addCommandButton(QWidget *btn)

    commBtnsLayout->addWidget(btn);


class IpTrafficPage : public AbstractTrafficPage

    Q_OBJECT
public:
    explicit IpTrafficPage(QWidget *parent = 0) : AbstractTrafficPage(parent) ;
;

class SpecTrafficPage : public AbstractTrafficPage

    Q_OBJECT
public:
    explicit SpecTrafficPage(QWidget *parent = 0) : AbstractTrafficPage(parent) ;
;

class AbstractManagerTab : public QWidget 
public:
    AbstractManagerTab(QWidget *parent);
    ~AbstractManagerTab();
    void addCommandButton(QWidget *btn);
private:
    QTabWidget *pHTab;


AbstractManagerTab::AbstractManagerTab(QWidget *parent) :
QWidget(parent),
pHTab(new QTabWidget)

    IpTrafficPage *ipPage = new IpTrafficPage(this);
    pHTab->addTab(ipPage, tr("IP);
    SpecTrafficPage *specPage = new SpecTrafficPage(this);
    pHTab->addTab(specPage, tr("Spec"));

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(pHTab);
    setLayout(mainLayout);


AbstractManagerTab::~AbstractManagerTab()

    delete pHTab;


AbstractManagerTab::addCommandButton(QWidget *btn) 

    for (int index = 0; index < pHTab->count(); ++index) 
        AbstractTrafficPage *page = dynamic_cast<AbstractTrafficPage *>
                (pHTab->widget(index));
        if (page)
            page->addCommandButton(btn);
    


class StoredRecsTab : public AbstractManagerTab

    Q_OBJECT
public:
    explicit StoredRecsTab(QWidget *parent = 0);
;

StoredRecsTab::StoredRecsTab(QWidget *parent) :
    AbstractManagerTab(parent)

    QPushButton *createRecBtn = new QPushButton(tr("Create"), this);
    QPushButton *removeRecBtn = new QPushButton(tr("Remove"), this);

    addCommandButton(createRecBtn);
    addCommandButton(removeRecBtn);

【问题讨论】:

【参考方案1】:

任何 QWidget 只能有一个父级。如果要将按钮添加到许多小部件,则需要创建许多按钮对象(每个选项卡一个)。

另一个选项是在标签更改时将按钮移动到可见标签。但我认为这不是一个好的决定。

【讨论】:

+1 推荐另一个让我发笑的选项:-P 确实,我不会推荐它... 非常感谢。我将不得不重新考虑架构。

以上是关于带有动态变化小部件的 QTabWidget的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中获取动态文本小部件的宽度?

动态创建带有闪亮绘图的选项卡,而无需重新创建现有选项卡

动态更改小部件的文本颤动/飞镖

使用 Qtabwidget 中的小部件

GridLayout 动态变化以填充 Gone 视图

如何从另一个类访问小部件