[英]Qt - Child widgets are not shown
I'm building a multi-window app and so far creates and shows MainWidget with 8 buttons. 我正在构建一个多窗口应用程序,到目前为止,它创建并显示具有8个按钮的MainWidget。 My next step is to make each button open a new window which in Qt terms is a child of QWidget.
我的下一步是使每个按钮打开一个新窗口,以Qt术语来说,它是QWidget的子级。 I keep all my buttons and new windows (which should be opened upon a button is clicked) in QVectors.
我将所有按钮和新窗口(应在单击按钮时打开)保留在QVectors中。 It all compiles with no warnings or errors, however, when I click a button, the corresponding QWidget window is not shown.
编译时没有警告或错误,但是,当我单击按钮时,未显示相应的QWidget窗口。
mainwidget.h mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QGridLayout>
#include <QSignalMapper>
#include "examwindow.h"
namespace Ui { class MainWidget; }
class MainWidget : public QWidget {
Q_OBJECT
public:
explicit MainWidget(QWidget *parent = 0);
~MainWidget();
private:
Ui::MainWidget *ui;
int nExams;
QVector<QString> titles;
QVector<QPushButton*> examButtons;
QGridLayout* mainWidgetLayout;
QVector<ExamWindow*> examWindows;
public slots:
void clickedExamW ();
};
#endif // MAINWIDGET_H
mainwidget.cpp mainwidget.cpp
#include "mainwidget.h"
#include "ui_mainwidget.h"
#include <QDesktopWidget>
#include <iostream>
MainWidget::MainWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MainWidget)
{
ui->setupUi(this);
/**
* @brief Resize the main window size in proportion to the desktop size
*/
double ratio = 0.7;
resize(QDesktopWidget().availableGeometry(this).size() * ratio);
/**
* @brief Set the main window position in the desktop center
*/
QDesktopWidget dw;
int width = this->frameGeometry().width();
int height = this->frameGeometry().height();
int screenWidth = dw.screen() -> width();
int screenHeight = dw.screen() -> height();
this->setGeometry((screenWidth / 2) - (width / 2), (screenHeight / 2) - (height / 2), width, height);
/**
* Set the button titles
*/
titles.push_back("FCE - 2008");
titles.push_back("CAE - 2008");
titles.push_back("CPE - 2008");
titles.push_back("ЕГЭ");
titles.push_back("FCE - 2015");
titles.push_back("CAE - 2015");
titles.push_back("CPE - 2015");
titles.push_back("User's Format");
/**
* Create buttons
*/
nExams = 8; // Number of exams
examButtons.resize(nExams);
for(int i = 0; i < nExams; i++) {
examButtons[i] = new QPushButton(titles[i]);
examButtons[i]->setMinimumSize(QSize(150, 150));
examButtons[i]->setMaximumSize(QSize(500, 500));
examButtons[i]->setObjectName(titles[i]);
connect(examButtons[i], SIGNAL(clicked()), this, SLOT(clickedExamW()));
}
/**
* Add exam buttons to the main widget layout
*/
mainWidgetLayout = new QGridLayout(this);
for(int i = 0; i < nExams; i++)
if (i < nExams / 2)
mainWidgetLayout -> addWidget(examButtons[i], i, 0);
else
mainWidgetLayout -> addWidget(examButtons[i], i - nExams / 2, 1);
/**
* Create exam windows
*/
examWindows.resize(nExams);
for(int i = 0; i < nExams; i++) {
examWindows[i] = new ExamWindow(this);
examWindows[i]->setWindowTitle(titles[i]);
}
}
void MainWidget::clickedExamW() {
QObject *senderObj = sender();
QString senderObjName = senderObj->objectName();
for(int i = 0; i < nExams; i++)
if (senderObjName == titles[i]) {
this->setWindowTitle(titles[i]); // WORKS - it changes the title
examWindows[i]->show(); // DOES NOT WORK - no win shown
}
}
MainWidget::~MainWidget()
{
delete ui;
}
examwindow.h examwindow.h
#ifndef EXAMWINDOW_H
#define EXAMWINDOW_H
#include <QWidget>
class ExamWindow : public QWidget
{
Q_OBJECT
public:
explicit ExamWindow(QWidget *parent = 0);
signals:
public slots:
};
#endif // EXAMWINDOW_H
examwindow.cpp examwindow.cpp
#include "examwindow.h"
ExamWindow::ExamWindow(QWidget *parent) : QWidget(parent)
{
}
The way, how do you create widgets is ok ( examWindows[i] = new ExamWindow(this);
). 好的方式,如何创建窗口小部件是可以的(
examWindows[i] = new ExamWindow(this);
)。 But: 但:
ExamWindow::ExamWindow(QWidget *parent)
: QWidget(parent, Qt::Window)
{}
You need to directly specify a flag that you need a "window" widget. 您需要直接指定需要“窗口”窗口小部件的标志 。
Or, if you don't want to set parent widget, you may set Qt::WA_DeleteOnClose
attribute for automatic releasing memory. 或者,如果您不想设置父窗口小部件,则可以设置
Qt::WA_DeleteOnClose
属性以自动释放内存。 Note, that in this case you will have an invalid pointer inside your examWindows
vector. 请注意,在这种情况下,
examWindows
向量中将具有无效的指针。 It may be resolved if you will use next declaration: QVector<QPointer<ExamWindow>> examWindows;
如果使用下一个声明,则可以解决:
QVector<QPointer<ExamWindow>> examWindows;
ANSWER: it turned out that the problem was in this line: 答案:问题出在这一行:
examWindows[i] = new ExamWindow(this);
If I remove 'this', making my windows parentless, it works as intended. 如果删除“ this”,使我的窗口成为无父母状态,它将按预期工作。 I'm puzzled why and I guess I have to delete them now manually.
我不知道为什么,我想我现在必须手动删除它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.