所以这是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()函数。
答案 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()
{
}