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

时间:2019-08-27 15:33:33

标签: c++ qt

我正在Qt上使用Qt 5.13学习MacOS
首先,我定义从MyWidget继承的QWidgetMyWidget有一个QPushButton,但此按钮将在称为“新鲜”的插槽函数中创建,而不是在构造函数中创建。
我在MyWidget中继承了MainWindow(从QMainWindow继承),并定义了另一个button_2发出信号来调用MyWidget的'fresh'函数来创建按钮。
如果我没有先在MyWidget中隐藏MainWindow,则MyWidget的按钮将不会显示。如果我先隐藏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

mywidget.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();
}

mainwindow.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

MainWindow.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);
}

main.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();
}

如果我在mainwindow.cpp中添加myWidget->hide();,那似乎是正确的。
如果删除它,即使重新粉刷,更新或以新功能显示,绿色按钮也不会显示。

1 个答案:

答案 0 :(得分:0)

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

和按钮的作用相同。