Нет ничего особенного в добавлении элементов в макет во время выполнения.
Я бы предложил создать макет сетки и сохранить его как элемент виджета, в который вы хотите его отобразить, и подключить сигнал clicked()
вашей кнопки к пользовательскому слоту, если этот виджет.
Примерно так:
class Win: public QWidget
{
Q_OBJECT
public:
Win(QWidget *parent=0): QWidget(parent)
{
QPushButton *b1 = new QPushButton("click");
QVBoxLayout *vl = new QVBoxLayout;
layout = new QGridLayout; // this is your grid layout
vl->addWidget(b1);
vl->addLayout(layout); // added to the widget's main layout
setLayout(vl);
connect(b1, SIGNAL(clicked()), this, SLOT(clicked())); // connect button to slot
}
public slots:
void clicked()
{
int position = layout->rowCount(); // this works out as the first row index with nothing on it
QPushButton *b = new QPushButton;
b->setIcon(<<the icon you want>>);
b->setText(<<the text you want>>);
layout->addWidget(b, position, 0);
layout->addWidget(new QLabel(<<whatever you want here>>), position, 1);
...
}
private:
QGridLayout *layout;
};
Ничто не мешает вам добавить новый QGridLayout
и добавить к нему новые виджеты во время выполнения. Вероятно, будет немного сложно управлять переменным числом макетов в вашем пользовательском интерфейсе.
Ваш код не имеет особого смысла. Вы добавляете свои кнопки к QVBoxLayout
, затем добавляете пустой макет сетки, затем устанавливаете виджет вашей области прокрутки на то, чего не существует (vl->widget()
вернет NULL, поскольку QVBoxLayout не является виджетом, см. здесь ), а затем добавить эту область прокрутки в макет, который вы пытались включить в саму область прокрутки?
Вам необходимо правильно вложить макеты и виджеты.
- Добавьте кнопки в макет сетки, если вы этого хотите.
- Затем создайте контейнерный виджет для этого макета (например,
QFrame
) и установите макет этого виджета в соответствии с вашим сеточным макетом.
- Затем добавьте это
QFrame
в QScrollArea
.
- Затем добавьте область прокрутки в макет виджета вашего контейнера.
Пожалуйста, ознакомьтесь с примерами Qt и документацией макета , включая образец Image Viewer . Вам нужно больше узнать о макетах.