Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用update()函数查看应用程序更改时出现问题_C++_Qt - Fatal编程技术网

C++ 使用update()函数查看应用程序更改时出现问题

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

我开始学习使用qt编程,并熟悉我正在制作的简单小程序库。其中一个计划是创建Qlabel,每次按下按钮时都应该将其添加到应用程序中,但我不明白为什么它们不会出现。代码如下:

文件.h:

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);