Я использую QTabWidget (pHTab, созданный в AbstractManagerTab), чтобы показать некоторые данные
(Виджеты 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);
}
Любой QWidget может иметь только одного родителя. Если вы хотите добавить кнопку во многие виджеты, вам нужно создать много объектов кнопки (по одному на вкладку).
Другой вариант — переместить кнопку на видимую вкладку при смене вкладки. Но я думаю, что это не очень хорошее решение.
Других решений пока нет …