问题描述
|
如何在运行时创建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,162,26));
b2->setGeometry(QRect(0,26));
b3->setGeometry(QRect(0,26));
b4->setGeometry(QRect(0,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);
谢谢。
解决方法
在运行时向布局添加内容没有什么特别的。
我建议您创建网格布局并将其存储为要显示在其中的窗口小部件的成员,然后将按钮的ѭ1信号连接到自定义插槽(如果该窗口小部件)。
像这样:
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>>),1);
...
}
private:
QGridLayout *layout;
};
没有什么可以阻止您在运行时添加新的ѭ3并向其中添加新的小部件。在UI上管理可变数量的布局可能会有些困难。
您的代码没有什么意义。您正在将按钮添加到QVBoxLayout
,然后向其添加空网格布局,然后将滚动区域的小部件设置为不存在的内容(vl->widget()
将返回NULL,因为QVBoxLayout不是小部件,请参见此处),然后将该滚动区域添加到您要包括在滚动区域本身中的布局中?
您需要正确嵌套布局和小部件。
如果需要的话,将按钮添加到网格布局中。
然后为该布局创建一个容器小部件(例如,a6ѭ),并将该小部件的布局设置为网格布局。
然后将QFrame
加到QScrollArea
中。
然后将添加滚动区域添加到容器小部件的布局中。
请仔细阅读Qt示例和布局文档,包括Image Viewer示例。您需要研究有关布局的更多信息。
, 以及静态(:
在添加新的布局之前,您应该删除旧的布局和小部件。之后,您需要添加新的布局和小部件。
并且不要忘记为布局所在的所有小部件和表单/对话框调用ѭ9。
UPD:
b1->show();
b2->show();
b3->show();
b4->show();
this->update();
this->show();