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

Qt 如何在运行时创建QGridLayout并动态生成行?,qt,Qt,如何在运行时创建QGridLayout,动态生成行,并向其中动态添加按钮 在按钮上,我想在运行时放置图像和标签 我在按钮点击上创建了四个按钮,并尝试在其上放置一个图标,但它没有出现在它上面,我试图使我的网格可滚动(垂直),但它不可滚动 QScrollArea *scrollArea = new QScrollArea(this); QPushButton *b1 = new QPushButton(strsearch); QPushButton

如何在运行时创建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);

谢谢。

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

我建议您创建网格布局,并将其存储为要显示的小部件的一个成员,然后将按钮的
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;
};
classwin:publicqwidget
{
Q_对象
公众:
Win(QWidget*parent=0):QWidget(parent)
{
QPushButton*b1=新的QPushButton(“点击”);
QVBoxLayout*vl=新的QVBoxLayout;
layout=new QGridLayout;//这是您的网格布局
vl->addWidget(b1);
vl->addLayout(布局);//添加到小部件的主布局
setLayout(vl);
连接(b1,信号(单击()),此,插槽(单击());//将按钮连接到插槽
}
公众时段:
无效单击()
{
int position=layout->rowCount();//这是第一行索引,上面没有任何内容
QPushButton*b=新的QPushButton;
b->setIcon();
b->setText();
布局->添加小部件(b,位置,0);
布局->添加小部件(新的QLabel(),位置,1);
...
}
私人:
QGridLayout*布局;
};
没有任何东西可以阻止您在运行时添加新的
QGridLayout
,并向其添加新的小部件。管理UI上数量可变的布局可能会有点困难


您的代码没有多大意义。您正在将按钮添加到
QVBoxLayout
,然后添加一个空的网格布局,然后将滚动区域的小部件设置为不存在的内容(
vl->widget()
将返回NULL,因为QVBoxLayout不是小部件,请参阅),然后将该滚动区域添加到您试图包含到滚动区域本身的布局中

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

  • 如果需要,将按钮添加到网格布局中
  • 然后为该布局创建一个容器小部件(例如a
    QFrame
    ),并将该小部件的布局设置为网格布局
  • 然后将
    QFrame
    添加到
    qscrollara
  • 然后将添加滚动区域放到容器小部件的布局中
请检查Qt样本和,包括样本。您需要学习更多关于布局的知识。

以及静态(:

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

不要忘记调用
show
,查看布局所在的所有小部件和表单/对话框

UPD:

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

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

@Mat:谢谢。但是如何在运行时将图像和标签放置在按钮的顶部。只需创建按钮并设置图标/文本(更新我的示例代码以显示该图标/文本)。您所要求的内容没有什么特别之处,请看,它们向您展示了如何创建小部件的基本知识(在运行时)@Mat:我的要求是,我应该根据搜索结果创建按钮,并且它也应该是可滚动的。如何使其可滚动?您可以将您的小部件包括在可滚动区域中,或者使用专门用于此的小部件(即QTableWidget或QListWidget)。您需要花费一些时间和精力亲自研究此问题,Qt文档中有大量示例供您查看,并且类文档本身非常广泛。编辑了我的答案,但请阅读有关Qt布局的文档。您发布的代码没有真正意义。