2013-06-20 5 views
0

Я использую QTabWidget (pHTab составленный в AbstractManagerTab), чтобы показать некоторые данные (IpTrafficPage и SpecTrafficPage виджетов), и мне нужно динамически добавлять кнопки QPushButton для добавленных закладок.QTabWidget с динамическим изменением виджетами

При запуске приложения добавленные кнопки видны только на последней вкладке. Что может быть неправильным?

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); 
} 

ответ

2

Любой QWidget может иметь только одного родителя. Если вы хотите добавить кнопку ко многим виджетам, вам нужно создать много объектов кнопок (по одной на вкладку).

Другой вариант - переместить кнопку на видимую вкладку при изменении вкладок. Но я думаю, что это не очень хорошее решение.

+0

+1 Для предложения другого варианта, который заставил меня смеяться :-P Действительно, я бы не рекомендовал его ... – Boris

+0

Большое спасибо. Мне придется переосмыслить архитектуру. – Pavel