Qt 如何在运行时创建QGridLayout并动态生成行?
如何在运行时创建QGridLayout,动态生成行,并向其中动态添加按钮 在按钮上,我想在运行时放置图像和标签 我在按钮点击上创建了四个按钮,并尝试在其上放置一个图标,但它没有出现在它上面,我试图使我的网格可滚动(垂直),但它不可滚动Qt 如何在运行时创建QGridLayout并动态生成行?,qt,Qt,如何在运行时创建QGridLayout,动态生成行,并向其中动态添加按钮 在按钮上,我想在运行时放置图像和标签 我在按钮点击上创建了四个按钮,并尝试在其上放置一个图标,但它没有出现在它上面,我试图使我的网格可滚动(垂直),但它不可滚动 QScrollArea *scrollArea = new QScrollArea(this); QPushButton *b1 = new QPushButton(strsearch); QPushButton
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
- 然后将添加滚动区域放到容器小部件的布局中
show
,查看布局所在的所有小部件和表单/对话框
UPD:
b1->show();
b2->show();
b3->show();
b4->show();
this->update();
this->show();
@Mat:谢谢。但是如何在运行时将图像和标签放置在按钮的顶部。只需创建按钮并设置图标/文本(更新我的示例代码以显示该图标/文本)。您所要求的内容没有什么特别之处,请看,它们向您展示了如何创建小部件的基本知识(在运行时)@Mat:我的要求是,我应该根据搜索结果创建按钮,并且它也应该是可滚动的。如何使其可滚动?您可以将您的小部件包括在可滚动区域中,或者使用专门用于此的小部件(即QTableWidget或QListWidget)。您需要花费一些时间和精力亲自研究此问题,Qt文档中有大量示例供您查看,并且类文档本身非常广泛。编辑了我的答案,但请阅读有关Qt布局的文档。您发布的代码没有真正意义。