Ну вот наконец-то я осилил пример с кнопкой..
Создаётся кнопка при нажатии на которую создаётся аналогичная(++N), и так до бесконечности..
и представляю код на ваш суд..
button.h
#ifndef BUTTON_H
#define BUTTON_H
#include <QToolButton>
class Button : public QToolButton
{
Q_OBJECT
public:
Button(const QString &text, QWidget *parent = 0);
QSize sizeHint() const;
};
#endif
button.cpp
#include <QtGui>
#include "button.h"
Button::Button(const QString &text, QWidget *parent)
: QToolButton(parent)
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
setText(text);
}
QSize Button::sizeHint() const
{
QSize size = QToolButton::sizeHint();
size.rheight() += 20;
size.rwidth() = qMax(size.width(), size.height());
return size;
}
text_button.h
#ifndef TEXT_BUTTON_H
#define TEXT_BUTTON_H
#include <iostream>
#include <QObject>
#include <QtGui>
/*
* можно не использовать класс "button.h" и писать вместо
* Button *button = new Button("new"+QString::number(Schet));
* QToolButton *button = new QToolButton("new"+QString::number(Schet));
* но так удобнее
*/
#include "button.h"
class text_button : public QObject
{
Q_OBJECT
/* Здесь будут храниться все указатели на кнопки */
QMap<int,Button*> mapNewButtons;
int Schet; /* счётчик кнопок */
public:
explicit text_button(QObject *parent = 0);
Button *NewButton();
void MAddButton();
signals:
public slots:
void clickMainBtn();
};
#endif // TEXT_BUTTON_H
text_button.cpp
#include "text_button.h"
text_button::text_button(QObject *parent) :
QObject(parent), Schet(0)
{
}
Button *text_button::NewButton()
{
Button *button = new Button("new"+QString::number(Schet));
/* Можно обработать кнопку сразу при создании */
/*
QObject::connect(button, SIGNAL(clicked()),
this, SLOT(clickMainBtn())
);
*/
qDebug() << SLOT(clickMainBtn());
return button;
}
void text_button::MAddButton()
{
/* Конечно можно было всё это сделать внутри функции NewButton(),
* но цель была показать как работать между классами
* имеено поэтому понадобился контейнерс с указателями */
mapNewButtons[++Schet] = NewButton();
mapNewButtons[Schet]->show();
/* Прикручиваем сигнал "создать новую кнопку"
* к только что созданной кнопке */
QObject::connect(mapNewButtons[Schet], SIGNAL(clicked()),
this, SLOT(clickMainBtn())
);
}
void text_button::clickMainBtn()
{
emit MAddButton();
}
main.cpp
#include "text_button.h"
int main(int argc, char **argv)
{
QApplication app(argc,argv);
QWidget wgt;
/* Первая кнопка */
QPushButton mainbtn("Add new Button");
QVBoxLayout vbl;
text_button buttonNew; /* Класс дл создания N кнопок */
vbl.addWidget(&mainbtn);
wgt.setLayout(&vbl);
/* Здесь мы просто создаём новую кнопку используя наш класс */
Button *btn = buttonNew.NewButton();
/* аналогично можно работать с новой кнопкой */
vbl.addWidget(btn);
wgt.show();
/* Создаём для певой главной кнопки сигнал
* "создать новую кнопку" используя наш класс */
QObject::connect(&mainbtn, SIGNAL(clicked()),
&buttonNew, SLOT(clickMainBtn())
);
return app.exec();
}