Как создать QGridLayout во время выполнения и динамически генерировать строки? - PullRequest
0 голосов
/ 13 июня 2011

Как создать QGridLayout во время выполнения, динамически генерировать строки и динамически добавлять к нему кнопки?

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

 QScrollArea *scrollArea = new QScrollArea(this);         

       QPushButton *b1 = new QPushButton(strsearch);
       QPushButton *b2 = new QPushButton(strsearch);
       QPushButton *b3 = new QPushButton(strsearch);
       QPushButton *b4 = new QPushButton(strsearch);


       b1->setGeometry(QRect(0, 0, 162, 26));
       b2->setGeometry(QRect(0, 0, 162, 26));
       b3->setGeometry(QRect(0, 0, 162, 26));
       b4->setGeometry(QRect(0, 0, 162, 26));
       b1->setIcon(QIcon("user.gif"));
       b1->setIconSize(QSize(160, 26));
       b2->setIcon(QIcon("user.gif"));
       b2->setIconSize(QSize(160, 26));
       b3->setIcon(QIcon("user.gif"));
       b3->setIconSize(QSize(160, 26));
       b4->setIcon(QIcon("user.gif"));
       b4->setIconSize(QSize(160, 26));

       QVBoxLayout *vl = new QVBoxLayout;

       layout = new QGridLayout;  // this is your grid layout
       vl->addWidget(b1);
       vl->addWidget(b2);
       vl->addWidget(b3);
       vl->addWidget(b4);

       vl->addLayout(layout);
      scrollArea->setWidget(vl->widget());
       vl->addWidget(scrollArea);

       setLayout(vl);

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Как и статически (:

Перед добавлением нового макета вы должны удалить старый макет и виджеты. После этого вам нужно добавить новый макет и виджеты.

И не забудьте позвонить show для всех виджетов и формы / диалогового окна, где расположен ваш макет.

UPD:

b1->show();
b2->show();
b3->show();
b4->show();

this->update();
this->show();
0 голосов
/ 13 июня 2011

Нет ничего особенного в добавлении элементов в макет во время выполнения.

Я бы предложил создать макет сетки и сохранить его как элемент виджета, в который вы хотите его отобразить, и подключить сигнал 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 . Вам нужно больше узнать о макетах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...