C++ 使用update()函数查看应用程序更改时出现问题
我开始学习使用qt编程,并熟悉我正在制作的简单小程序库。其中一个计划是创建Qlabel,每次按下按钮时都应该将其添加到应用程序中,但我不明白为什么它们不会出现。代码如下: 文件.h:C++ 使用update()函数查看应用程序更改时出现问题,c++,qt,C++,Qt,我开始学习使用qt编程,并熟悉我正在制作的简单小程序库。其中一个计划是创建Qlabel,每次按下按钮时都应该将其添加到应用程序中,但我不明白为什么它们不会出现。代码如下: 文件.h: class Base : public QWidget { Q_OBJECT public: explicit Base(QWidget *parent = 0); ~Base(); public slots: void AddWidget(); private: QVB
class Base : public QWidget
{
Q_OBJECT
public:
explicit Base(QWidget *parent = 0);
~Base();
public slots:
void AddWidget();
private:
QVBoxLayout *Vlayout;
};
文件.cpp
Base::Base(QWidget *parent)
: QWidget(parent)
{
Vlayout=new QVBoxLayout(this);
QPushButton *l=new QPushButton("+",this);
Vlayout->addWidget(l);
connect(l,SIGNAL(clicked()),this,SLOT(AddWidget()));
}
Base::~Base()
{}
void Base::AddWidget(){
Vlayout->addWidget(new QLabel("Added",this));
Vlayout->update();
}
非常感谢 OPs代码中一定缺少某些内容 此外,在我看来,调用
Vlayout->update()
是不必要的
我做了一个演示:
testQWidgetAdd.cc
:
// Qt header:
#include <QtWidgets>
// main application
int main(int argc, char **argv)
{
qDebug() << "Qt Version:" << QT_VERSION_STR;
QApplication app(argc, argv);
// setup GUI
QWidget qWinMain;
qWinMain.setWindowTitle("Test Add Widget");
QVBoxLayout qVBox;
QPushButton qBtn("Add QLabel");
qVBox.addWidget(&qBtn);
qWinMain.setLayout(&qVBox);
qWinMain.show();
int i = 1;
// install signal handlers
QObject::connect(&qBtn, &QPushButton::clicked,
[&](bool) {
qVBox.addWidget(new QLabel(QString("QLabel %1").arg(i++)));
});
// runtime loop
return app.exec();
}
输出:
在多次单击“添加QLabel”按钮后:
根据请求,OP提供了我从中提取的以下代码片段:
Base::Base(QWidget *parent)
: QWidget(parent)
{
QHBoxLayout* Hlayout=new QHBoxLayout(this);
Vlayout=new QVBoxLayout(this);
QPushButton *m=new QPushButton("exit",this);
QPushButton *l=new QPushButton("+",this);
Hlayout->addWidget(l);
Hlayout->addWidget(m);
Vlayout->addLayout(Hlayout);
connect(l,SIGNAL(clicked()),this,SLOT(AddWidget()));
connect(m,SIGNAL(clicked()),qApp,SLOT(quit()));
m->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
l->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
}
这就是断裂的部分:
QHBoxLayout* Hlayout=new QHBoxLayout(this);
Vlayout=new QVBoxLayout(this);
逐步解释:
是从class Base
派生的。因此,应用QWidget
的布局管理QWidget
支持一种布局来管理子项的位置和大小。 它必须由用户应用。摘自文件: 如果此小部件上已经安装了布局管理器,QWidget将不允许您安装其他布局管理器QWidget
- 布局可以使用或不使用父窗口小部件构建
QWidget::setLayout()
)或将其添加到另一个布局中
不过,我个人更喜欢明确地设置布局(但这可能是一个品味问题)
OP的实际错误:Hlayout
和Vlayout
是使用this
构建的,但是不能将两个布局设置为this
。因此,第二个问题被忽略了
因此,添加到Vlayout
的小部件无法显示,因为Vlayout
未在this
中设置,QLabel
s不能成为this
的子项
一个可能的解决方案:
而不是
QHBoxLayout* Hlayout=new QHBoxLayout(this);
一定是这样
QHBoxLayout* Hlayout=new QHBoxLayout();
将Hlayout
添加到Vlayout
的行已经存在(但之前没有达到预期效果):
不确定你的代码出了什么问题。也许,你没有公开的代码有问题。(或者,如果没有其他代码,则缺少一些基本类似的内容,例如function
main()
);-)谢谢你的回答。在这里我把我的完整程序的链接,我不知道这是否违反规则,如果是的话,我会尽快删除它@E.sk.ovf回答扩展。
Vlayout->addLayout(Hlayout);