Qt中最重要的类之一QApplication类,它管理图形用户界面应用程序的控制流和主要设置。
让我们来看看简单的程序。看看是怎么初始化的。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
AppplicationDemo w;
w.show();
returna.exec();
}
从代码看出,如果除了QApplication a(argc, argv ); return a.exec();剩下就跟普通的C++程序差不多。那么我们试试去掉这两行代码会怎么样呢。
int main(int argc, char *argv[])
{
//QApplicationa(argc, argv);
AppplicationDemo w;
w.show();
return0;
//returna.exec();
}
程序在试图创建AppplicationDemo对象时,会先去检查是否存在一个QApplication对象,也就是检查程序是否已经初始化。跟踪源码可以发现,在qwidget构造函数里有这么一个判断
其中,全局指针qApp指向全局的QApplication对象。它必须在任何绘制设备(包括窗口部件、像素映射、位图等等)之前被构造。
如果我们试图创建两个QApplication对象呢?
int main(int argc, char *argv[])
{
QApplicationa(argc, argv);
QApplication b(argc, argv);;
AppplicationDemo w;
w.show();
returna.exec();
}
程序也不允许。我们知道QCoreApplication是QApplication的基类,而QCoreApplication中存在静态成员
所以在初始化第二个QApplication对象时自然报错。如以下代码
int QApplication::exec ()
进入主事件循环并且等待,直到exit()被调用或者主窗口部件被销毁,并且返回值被设置为exit()(如果通过quit(),exit()被调用,为0)。
需要调用这个函数来开始事件处理。主事件循环从窗口系统中接收事件并且把它们分派给应用程序窗口部件。看我修改后的代码:
class myDialog:publicQDialog
{
Q_OBJECT
public:
myDialog(QWidget *parent = 0);
~myDialog()
{ }
protected slots:
voidshowMessage();
private:
QLabel *pText;
QPushButton *pBtnOk;
};
myDialog::myDialog(QWidget*parent ):QDialog(parent)
{
pText = newQLabel(this);
pBtnOk = newQPushButton("OK",this);
connect(pBtnOk,SIGNAL(clicked()),this,SLOT(showMessage()));
pText->setGeometry(10,10,100,20);
pBtnOk->setGeometry(10,50,50,20);
}
void myDialog::showMessage()
{
pText->setText("Click Responsed ");
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
myDialog dialog;
dialog.exec();
returna.exec();
}
很显然,在对话框起来的时候,即执行dialog.exec();程序还没进入主事件循环。但是我点击按钮也一样会显示消息。说明这个消息不是通过主事件循环发送的。dialog.exec();会运行一个自己本地的事件循环,捕捉消息后发送给对应的接收者。至于具体实现,以后再慢慢解析。