LINUX.ORG.RU

Избранные сообщения h0x0d9

Что почитать по проектировании архитектуры и разработке (и других тонкостях) модульных приложений?

Форум — Talks

SUBJ. Уточнения:

  • речь идёт о десктопных, мобильных, «серверных» приложениях
  • язык C++ (если это имеет значение)
  • модульность обеспечивается динамически подгружаемыми/выгружаемыми плагинами

 , ,

Chaser_Andrey
()

QTabWidget и динамически изменяющаяся страница

Форум — Development

Здравствуйте. В классе AbstractManagerTab используется QTabWidget для отображения в его вкладках страниц IpTrafficPage и SpecTrafficPage — специализаций базового AbstractTrafficPage. Специализации базового класса AbstractManagerTab — StoredRecsTab — должны добавлять командные кнопки в AbstractTrafficPage на все страницы внутреннего QTabWidget.

Представленный подход не позволяет этого добиться, т.к. один и тот же объект QWidget не может одновременно отображаться в нескольких местах. Надеюсь, что посоветуете или наведете на правильную мысль.

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 *hTab;
}

AbstractManagerTab::AbstractManagerTab(QWidget *parent) :
QWidget(parent),
hTab(new QTabWidget)
{
    IpTrafficPage *ipPage = new IpTrafficPage(this);
    hTab->addTab(ipPage, tr("IP);
    SpecTrafficPage *specPage = new SpecTrafficPage(this);
    hTab->addTab(specPage, tr("Spec"));

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

AbstractManagerTab::~AbstractManagerTab()
{
    delete hTab;
}

AbstractManagerTab::addCommandButton(QWidget *btn) 
{
    for (int index = 0; index < hTab->count(); ++index) {
        AbstractTrafficPage *page = dynamic_cast<AbstractTrafficPage *>
                (hTab->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);
}

 ,

h0x0d9
()