如何在运行时创建QGridLayout并动态生成行?

时间:2011-06-13 08:43:24

标签: qt

如何在运行时创建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 个答案:

答案 0 :(得分:1)

以及静态(:

在添加新布局之前,您应该删除旧的布局和小部件。之后,您需要添加新的布局和小部件。

并且不要忘记为布局所在的所有小部件和表单/对话框调用show

<强> UPD:

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

this->update();
this->show();

答案 1 :(得分:0)

在运行时向布局添加内容没有什么特别之处。

我建议您创建网格布局并将其存储为要显示的窗口小部件的成员,并将按钮的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并向其添加新的小部件。在UI上管理可变数量的布局可能会有点困难。


你的代码没有多大意义。您将按钮添加到QVBoxLayout,然后向其添加空网格布局,然后将滚动区域的窗口小部件设置为不存在的窗口(vl->widget()将返回NULL,因为QVBoxLayout是不是小部件,请参阅here),然后将该滚动区域添加到您尝试包含在滚动区域中的布局中?

您需要正确嵌套布局和小部件。

  • 如果这是您想要的,请将按钮添加到网格布局中。
  • 然后为该布局创建一个容器窗口小部件(例如QFrame),并将该窗口小部件的布局设置为网格布局。
  • 然后将QFrame添加到QScrollArea
  • 然后将添加滚动区域添加到容器小部件的布局中。

请仔细阅读Qt示例和layout documentation,包括Image Viewer示例。您需要更多地了解布局。