我正在Qt
上使用Qt 5.13
学习MacOS
。
首先,我定义从MyWidget
继承的QWidget
。 MyWidget
有一个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();
,那似乎是正确的。
如果删除它,即使重新粉刷,更新或以新功能显示,绿色按钮也不会显示。
答案 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));
和按钮的作用相同。