调用 setVisible(false) 在 QWidget 的构造函数中不起作用
Posted
技术标签:
【中文标题】调用 setVisible(false) 在 QWidget 的构造函数中不起作用【英文标题】:Call to setVisible(false) won't work in QWidget's constructor 【发布时间】:2019-03-31 10:26:03 【问题描述】:当在 QWidget 的构造函数中调用 this->setvisible(false) 时,它不一定会隐藏。在这里,我写了一个最小的示例,其中 mw 将隐藏而 mw2 不会。
但是,mw2 仍然可以稍后通过调用连接来设置隐藏。
为什么隐藏 mw 而不是 mw2?
我想了解为什么要添加此附件以及如何解决它。我做错了吗?
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
/*
* ui_mainwindow.h is the default generated file for the mainwindow. I just added
* a QVerticalLayout containing a QPushButton and a ScrollArea inside the central widget
* (aka: verticalLayout, pushButton, scrollArea).
*/
#include "ui_mainwindow.h"
#include <QMainWindow>
#include <QTextBrowser>
class MyWidget: public QTextBrowser
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr)
: QTextBrowser(parent)
this->setText("content");
innerHide();
void innerHide()
this->hide();
;
class MainWindow : public QMainWindow
Q_OBJECT
private:
Ui::MainWindow *ui;
MyWidget* mw2;
public:
explicit MainWindow(QWidget *parent = nullptr):
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
MyWidget* mw = new MyWidget(this); // will hide
mw2 = new MyWidget(this); // call for innerHide but won't hide
ui->verticalLayout->addWidget(mw);
ui->scrollArea->setWidget(mw2);
connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(callHide())); // will hide when triggered
~MainWindow()
delete ui;
public slots:
void callHide()
mw2->innerHide();
;
#endif // MAINWINDOW_H
#include <QApplication>
int main(int argc, char *argv[])
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
【问题讨论】:
【参考方案1】:调用此行ui->scrollArea->setWidget(mw2);
将设置mw2
再次可见。在构造函数末尾调用MyWidget::innerHide
:
class Widget: public QWidget
public:
Widget()
QScrollArea * area = new QScrollArea();
QLabel* label = new QLabel("Should be hidden");
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(area);
label->hide(); // Hidden but will not work if before the next line
area->setWidget(label); // Visible
label->hide(); // Hidden
;
int main(int argc, char *argv[])
QApplication app(argc, argv);
Widget *w = new Widget();
w->show();
return app.exec();
【讨论】:
以上是关于调用 setVisible(false) 在 QWidget 的构造函数中不起作用的主要内容,如果未能解决你的问题,请参考以下文章