Слоты и сигналы QMdiArea - PullRequest
       40

Слоты и сигналы QMdiArea

0 голосов
/ 18 февраля 2019

Есть 2 класса с формами, из главного окна (MainWindow) я вызываю форму (Dialog) в появившейся форме, чтобы нажать кнопку, и виджет рисуется в MainWindow в mdiArea.Проблема в том, что диалоговое окно появляется, но когда вы нажимаете на кнопку виджета в MainWindow, оно не рисует.

MainWindow.h

 #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include <QGridLayout>
    #include <QLabel>
    #include "QMdiArea"
    #include "QtGui"
    #include "dialog.h"
    #include "form.h"

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow {
    Q_OBJECT

    public:

    explicit MainWindow(QWidget* parent = nullptr);
    ~MainWindow();

    public slots:

    void goToFormWindow();
    void receiverData();

    private:

    Ui::MainWindow* ui;
    Dialog dialog;
    QMdiArea* mdiArea;
    };

    #endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget* parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow) {
   ui->setupUi(this);

   connect(ui->pushButton_formWindow, &QPushButton::clicked,   this, &MainWindow::goToFormWindow);
   connect(&dialog,                   &Dialog::goToMainWindow, this, &MainWindow::receiverData);
}

MainWindow::~MainWindow() {
   delete ui;
}

void MainWindow::goToFormWindow() {
   Dialog* dialog = new Dialog();

   dialog->show();
}

void MainWindow::receiverData() {
   QWidget* widget         = new QWidget(mdiArea);
   QGridLayout* gridLayout = new QGridLayout(widget);

   widget->setLayout(gridLayout);
   QLabel* label = new QLabel("Hello, I am sub window!!!", widget);
   gridLayout->addWidget(label);

   mdiArea->addSubWindow(widget);
   widget->setWindowTitle("Sub Window");
   widget->show();
}

Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include "QtGui"

namespace Ui {
class Dialog;
}

class Dialog : public QDialog {
   Q_OBJECT

public:

   explicit Dialog(QWidget* parent = nullptr);
   ~Dialog();

public slots:

   void onPushButtonAddWindow();

signals:

   void goToMainWindow();

private:

   Ui::Dialog* ui;
};

#endif // DIALOG_H

Dialog.cpp

#include "dialog.h"
#include "ui_dialog.h"

Dialog::Dialog(QWidget* parent) :
   QDialog(parent),
   ui(new Ui::Dialog) {
   ui->setupUi(this);

   connect(ui->pushButton_addWindow, &QPushButton::clicked, this, &Dialog::onPushButtonAddWindow);
}

Dialog::~Dialog() {
   delete ui;
}

void Dialog::onPushButtonAddWindow() {
   emit goToMainWindow();
}
...