当在Qt中单击Dialog中的pushButton时,使MainWindow可见

时间:2015-10-24 08:28:08

标签: c++ qt

单击Dialog中的“按钮”时,我想切换回原来的MainWindow。我尝试了以下操作,使MainWindow的副本可见,我无法在那里编辑任何内容。请帮忙。

这是MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

这是MainWindow.cpp:

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

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

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

void MainWindow::on_pushButton_clicked()
{
    Dialog *dialog=new Dialog();
    dialog->setModal(false);
    dialog->show();
}

这是Dialog.h

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

这是Dialog.cpp:

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

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

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

void Dialog::on_pushButton_clicked()
{
    MainWindow *main=new MainWindow();
    main->show();
    main->activateWindow();
    main->raise();
    main->setFocus();
}

这是main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

1 个答案:

答案 0 :(得分:1)

MainWindow无法显示在模态对话框的顶部(如果对话框是无模式的,则可以显示)。请参阅QDialog::setModal

  • 如果对话框是模态的,将MainWindow重新置于前面的唯一方法是隐藏/关闭对话框。实际上,您可以设法在对话框的顶部显示它(使用您提供的代码),但是它将被阻止用户输入,因为模式对话框是唯一一个接受用户输入直到关闭的对话框。

  • 如果对话框无模式,请使用raise()(和/或setFocus() activateWindow()进行测试)将MainWindow带回到前面,但是,您需要一种访问MainWindow实例的方法,您不应该创建一个新的实例。最简单的方法是将MainWindow指针传递给对话框构造函数,以便对话框可以将其存储为属性,并在单击按钮时将其显示在前面。

例如:

class def : public QDialog
{
public:
    def( QMainWindow* parent );

    ...

private:
    QMainWindow* m_parent;
};

def::def( QMainWindow* parent ) : QDialog( parent ), m_parent( parent )
{

}

void def::on_pushButton_clicked()
{
    m_parent->activateWindow();
    m_parent->raise();
    m_parent->setFocus();
}

// then, pass MainWindow reference to dialog upon creation
void MainWindow::on_pushButton_clicked()
{
    Dialog *dialog=new Dialog( this );
    dialog->setModal(false);
    dialog->show();
}