Qt关闭上一个窗口

时间:2015-02-06 19:45:07

标签: c++ qt

所以这是main.cpp的代码:

#include <QApplication>
#include <QtGui>
#include <mainwidget.h>

int main(int argc, char **argv)
{
 QPushButton button ("Hello world!");
 button.show();

 mainWidget widget;
 widget.show();

 return app.exec();
}

我希望“小工具”中的按钮关闭“Hello world!”窗口。我已经在“widget”中添加了该按钮,并在mainwidget.h中创建了一个函数(它还显示了一个消息框)并连接它们。我只是想知道相同的按钮如何关闭Hello World窗口。我想我必须在mainwidget.h中添加一些功能,但我不知道它是什么。教师说我们应该使用QWidget close()函数。

1 个答案:

答案 0 :(得分:2)

我会回答您的问题,但在我向您解释基本Qt应用程序的外观之前。

在Qt中,基本主要是:

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

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

    return a.exec();
}

在这里,您可以看到创建了一个QApplication,然后创建了一个MainWindow。 那么MainWindow课程是什么?

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

#endif // MAINWINDOW_H

它是MainWindow.h。正如您所看到的,MainWindow继承到QMainWindow类。它是创建图形用户界面的主窗口类。 Q_OBJECT定义用于qmake。确实,我会为这个类创建一个moc_mainwindow.cpp来管理Qt信号。 现在,如果您创建一个Empty构造函数和析构函数,则会得到一个空窗口:

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
}

MainWindow::~MainWindow()
{
}

然后你想写下#Hello; Hello world!&#34;在窗口中所以在Qt中写一个文本就可以使用QLabel了。所以要写“#Hello World!&#34;你得到:

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QWidget *widget = new QLabel("Hello world !", this);
}

MainWindow::~MainWindow()
{
}

然后在创建按钮后,您将使用QPushButton类。 所以你得到:

#include "mainwindow.h"
#include <QLabel>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QWidget *widget = new QLabel("Hello world !", this);
    setCentralWidget(widget);
    QPushButton *button = new QPushButton("close", this);
}

MainWindow::~MainWindow()
{
}

(我选择将QLabel设置为中央Widget以不在按钮后面添加标签,但在真正的Qt应用程序之后,QMainWindow的中央小部件通常是QWidget I&#39;我会解释你为什么之后) 现在你有了一个按钮。但是当你点击它时没有任何附加信息。 为什么?因为没有任何东西链接按钮和窗口。要在Qt中链接它,我们使用connect函数。 [http://qt-project.org/doc/qt-4.8/qobject.html][1]

所以当你点击按钮时连接关闭窗口:

#include "mainwindow.h"
#include <QLabel>
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QWidget *widget = new QLabel("Hello world !", this);
    setCentralWidget(widget);
    QPushButton *button = new QPushButton("close", this);
    connect(button, SIGNAL(clicked()), this, SLOT(close()));
}

MainWindow::~MainWindow()
{
}

正如您可以看到连接。在第一个参数中,我们将ll发送信号的对象放在按钮上。在第二个参数中,我们把信号链接到这里它点击了()这样做我们写SIGNAL(clicked())。第三,接收信号的对象,这里是关闭的窗口。在第四个参数中,接收信号时启动的功能。我们写这个SLOT(close())。

为什么要SIGNAL和SLOT?因为在Qt中创建信号我们使用信号:在.hh中创建一个槽并使用(公共或受保护或私有)槽: 例如:

Class Object
{
 Q_OBJECT
 ...
 signals:
   void aSignal();
 public slots:
   void aSlot();
 ...
};

注意:信号和插槽必须具有相同的返回和参数。

在组织对象之后,您将使用centralWidget中QWidget中的标签,以便:

#include "mainwindow.h"
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QWidget* centralWid = new QWidget(this);
    setCentralWidget(centralWid);

    QVBoxLayout *layout = new QVBoxLayout(centralWid);
    QWidget *widget = new QLabel("Hello world !", this);
    QPushButton *button = new QPushButton("close", this);
    layout->addWidget(widget);
    layout->addWidget(button);
    centralWid->setLayout(layout);

    connect(button, SIGNAL(clicked()), this, SLOT(close()));
}

MainWindow::~MainWindow()
{
}