简体   繁体   English

Qt-未显示子窗口小部件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM