稍后初始化的小部件将不会显示在主窗口中

Widget initialized later will not show in MainWindow

本文关键字:显示 窗口 初始化 小部      更新时间:2023-10-16

我正在学习QtMacOS上使用Qt 5.13
首先,我定义从QWidget继承MyWidgetMyWidget有一个QPushButton,但这个按钮将在一个名为"fresh"的插槽函数中创建,而不是在构造函数中创建。
我在MainWindow中添加了MyWidget(继承自QMainWindow(,并定义了另一个button_2来发出信号以调用MyWidget的"fresh"函数来创建按钮。
如果我没有先MainWindow中隐藏MyWidgetMyWidget的按钮将不会显示。如果我先把MyWidget藏起来,一切似乎都很好,
我希望知道原因。谢谢

我试图在"新鲜"功能中重新粉刷或更新MyWidget,但没有帮助。

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include<QPushButton>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
~MyWidget();
public slots:
void fresh();
private:
QPushButton* myButton;
};
#endif // WIDGET_H

我的小部件.cpp

#include "mywidget.h"
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent)
{
}
MyWidget::~MyWidget()
{
}

void MyWidget::fresh()
{
myButton = new QPushButton(this);
myButton->setStyleSheet("QPushButton { background-color: green;}");
show();
}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include"mywidget.h"
#include<QHBoxLayout>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
signals:
public slots:
private:
MyWidget* myWidget;
};
#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
QWidget* qwidget = new QWidget;
myWidget = new MyWidget(this);
QPushButton* button = new QPushButton("Show",this);
QHBoxLayout* mainLayout = new QHBoxLayout;
mainLayout->addWidget(myWidget);
mainLayout->addWidget(button);
qwidget->setLayout(mainLayout);
setCentralWidget(qwidget);
//myWidget->hide();
connect(button,&QPushButton::clicked,myWidget,&MyWidget::fresh);
}

主.cpp

#include "mywidget.h"
#include"mainwindow.h"
#include<QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}

如果我在主窗口中添加myWidget->hide();.cpp,这似乎是正确的。
如果我删除它,绿色按钮将不会显示,即使我重新绘制或更新或以全新功能显示。

'mywidget' 正在占用整个空间,如果你想知道它是否占用了所有空间:

mywidget->setStyleSheet("* {border: 4px solid orange;}")

由于您使用的是布局,因此可能需要确定 QPushButton 的最小大小。 QPushButton 具有默认的水平大小策略:"最小值",默认情况下。也许如果您使用此函数设置最小宽度:"setMinimumWidth(int width(",可能会解决您的问题。 另外,不要忘记称之为:

myButton->show();

从 QObject 继承的每个对象都应该用这个函数".show"显示。 以下是QSizePolicy的所有标志将帮助您了解布局中发生的事情(布局与QSizePlicy标志一起使用很多(:https://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum。

除非你不想要布局,否则你必须以这种方式指定位置和大小:

mywidget->setGeometry(QPoint(x, y), QSize(width, height));

你的按钮也是如此。