Qt第二小程序

这是QT新手容易遇见的问题,“class QApplication has no member named setMainWidget”。这是qt3程序里的成员函数,而你可能是用了qt4编译,qt4中没有setMainWidget成员。

以下是一个QT3程序

#include <qapplication.h>

#include <qpushbutton.h>

int main( int argc, char* argv[])

{

   QApplication a( argc, argv );  

   QPushButton hello( "Hello world!", 0 );

   hello.resize( 100, 30 );

   a.setMainWidget( &hello );

   hello.show();

   return a.exec();

}

*********************************

a.setMainWidget( &hello );

这个按钮被选为这个应用程序的主窗口部件。如果用户关闭了主窗口部件,应用程序就退出了。 你不用必须设置一个主窗口部件,但绝大多数程序都有一个。

修改之后的QT4程序

#include <QApplication>

#include <QPushButton>

int main( int argc, char* argv[] )

{

   QApplication a(argc, argv );  

   QPushButton* hello = new QPushButton( "Hello world!", 0 );

   hello -> resize( 100, 30 );

   hello -> show();

   return a.exec();

}

其中添加的 按钮或者标签控件也可以写在 自己建的cpp中,只需注意show的问题。

同时,注意new完的控件是否需要delete的问题,不然会有进程一直在内存中,而导致无法第二次正确运行。

比如

int main( int argc, char **argv )
{
    QApplication app( argc, argv );
QLabel *label=new QLabel(“Hello QT!”,0);
    app.setMainWidget( label );
    label->show();
    return a.exec();
}

这里label是new出来的一个指针变量,也就是在栈上申请的内存,在C++语言里,明确过,在栈上分配的内存是必须认为的用delete释放的,防止内存泄露。这里为什么没有呢。后来看到有的QT程序也有明确使用delete释放内存的。这里越发不解了。后来,查到原来是QT扩展了C++,如果指针对象有父对象时,可以不用显式释放内存。我们需要显式释放的是那些没有父对象的孤立的指针。但上面这个例子并没有继承父对象,注意第二个指针,指向父对象的指针参数为0,即没有父对象,但是setMainWidget把它设为了主窗口部件,它就和程序同步了,当程序退出的时候自动释放,孩子对象的释放也是如此,在QT中扩展了C++ ,如果父亲对象无效时,子对象自动释放分配的内存。

注意setMainWidget这是qt3中才有的,所以现在要注意

 

另外 在创建Qt Gui Application时,总会让你选择在QWidget,QMainWindow和QDialog中选择一个Base Class。
这三个类具体有什么区别呢?

先看官方的手册:

QWidget Class Reference
The QWidget class is the base class of all user interface objects.
Inherits: QObject and QPaintDevice.
Inherited by: ……, QDialog, ……,QMainWindow, ……

QDialog Class Reference
The QDialog class is the base class of dialog windows.
Inherits: QWidget.

QMainWindow Class Reference
The QMainWindow class provides a main application window.
Inherits: QWidget.

可以看到QMainWindow和QDialog都是继承自QWidget。再看看下面那段从网上转过来的介绍,大概就能了解三者之间的区别了。

 

QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己的表现。每一个窗口部件都是矩形,并且它们按Z轴顺序排列的。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。

QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态变得更容易。继承使创建当用户点击菜单项或者工具条按钮时被调用的槽成为可能。你也可以使用Qt设计器来创建主窗口。

QDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。QDialog可以是模式的也可以是非模式的。QDialog支持扩展性并且可以提供返回值。它们可以有默认按钮。QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。

QDialog 是最普通的顶级窗口。不被嵌入到一个父窗口部件的窗口部件被叫做顶级窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管如果使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和和不同的QDialog的子类是最普通的顶级窗口。

如果是顶级对话框,那就基于QDialog创建,如果是主窗体,那就基于QMainWindow,如果不确定,或者有可能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。当然了,实际中,你还可以基于任何其他部件类来派生。看实际需求了,比如QFrame、QStackedWidget等等。


 

你可能感兴趣的:(Qt第二小程序)