如何在运行时创建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);
感谢。
答案 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示例。您需要更多地了解布局。