第二章Hello World
作为一个初学者,安装完Qt后第一件事,当然Hello World一下,通常介绍编程的教科书都是从Hello World开始的,我不知道如果打破这个传统会带来什么后果,我现在还没有勇气去做第一个吃螃蟹的人。如果你不是第一次接触Qt,可以跳过本章节。下面用两个经典的示例来写讲述Hello World。
2.1从两个例子开始
示例一:
运行Qt Designer,点击菜单File->new,新建一个项目,
这里选择C++ Project,确定。接下来会提示项目保存位置,
选择保存路径和文件名,确定,然后,点击菜单File->New,选择C++ Source File,确定,录入以下内容:
#include <qapplication.h> #include <qpushbutton.h>
int main( int argc, char **argv ) { QApplication a( argc, argv );
QPushButton hellobtn( "Hello world!", 0 ); hellobtn.resize(100, 20 ); a.setMainWidget( &hellobtn ); hellobtn.show(); return a.exec(); } |
代码说明:
#include <qapplication.h>
这一行包含了QApplication类的定义。在每一个使用Qt的应用程序中都必须使用一个QApplication对象。QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和光标。
#include <qpushbutton.h>
这一行包含了QPushButton类的定义。参考文档的文件的最上部分提到了使用哪个类就必须包含哪个头文件的说明。
QPushButton是一个经典的图形用户界面按钮,用户可以按下去,也可以放开。它管理自己的观感,就像其它每一个QWidget。一个窗口部件就是一个可以处理用户输入和绘制图形的用户界面对象。程序员可以改变它的全部观感和它的许多主要的属性(比如颜色),还有这个窗口部件的内容。一个QPushButton可以显示一段文本或者一个QPixmap。
int main( int argc, char **argv )
{
main()函数是程序的入口。几乎在使用Qt的所有情况下,main()只需要在把控制转交给Qt库之前执行一些初始化,然后Qt库通过事件来向程序告知用户的行为。
argc是命令行变量的数量,argv是命令行变量的数组。这是一个C/C++特征。它不是Qt专有的,无论如何Qt需要处理这些变量(请看下面)。
QApplication a( argc, argv );
a是这个程序的QApplication。它在这里被创建并且处理这些命令行变量(比如在X窗口下的-display)。请注意,所有被Qt识别的命令行参数都会从argv中被移除(并且argc也因此而减少)。关于细节请看QApplication::argv()文档。
注意:在任何Qt的窗口系统部件被使用之前创建QApplication对象是必须的。
QPushButton hellobtn( "Hello world!", 0 );
这里,在QApplication之后,接着的是第一个窗口系统代码:一个按钮被创建了。
这个按钮被设置成显示“Hello world!”并且它自己构成了一个窗口(因为在构造函数指定0为它的父窗口,在这个父窗口中按钮被定位)。
hellobtn.resize( 100, 20 );
这个按酒被设置成100像素宽,20像素高(加上窗口系统边框)。在这种情况下,我们不用考虑按钮的位置,并且我们接受默认值。
a.setMainWidget( &hellobtn );
这个按钮被选为这个应用程序的主窗口部件。如果用户关闭了主窗口部件,应用程序就退出了。
你不用必须设置一个主窗口部件,但绝大多数程序都有一个。
hellobtn.show();
当你创建一个窗口部件的时候,它是不可见的。你必须调用show()来使它变为可见的。
return a.exec();
这里就是main()把控制转交给Qt,并且当应用程序退出的时候exec()就会返回。
在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件。
}
你现在可以试着编译和运行这个程序了。
编译
编译一个C++应用程序,你需要创建一个makefile。创建一个Qt的makefile的最容易的方法是使用Qt提供的连编工具qmake。如果你已经把main.cpp保存到它自己的目录了,你所要做的就是这些:
qmake hello.pro |
第一个命令调用qmake来生成一个.pro(项目)文件,运行后会生成一个makefile。你现在可以输入make(或者nmake,如果你使用Visual Studio),然后运行你的第一个Qt应用程序!
qmake hello.pro make ./hello |
运行后显示窗口
其实使用Qt Designer完全可以生成上面的代码,下面我们再看一个例子,
示例二:
运行Qt Designer,点击菜单File->new,新建一个项目,
这里选择C++ Project,确定。接下来会提示项目保存位置,
选择保存路径和文件名,确定。
选择菜单File->new,新建一个窗口,选择Dialog,确定
设置Form1的Caption为“我的程序”,在Property Editor设置窗口属性,如果你的IDE上看不到Property Editor,请通过菜单Windows->Views,将Property Editor/Signal Handlers选上。
接着在窗口上放一个TextLabel,选择Toolbox上的Common Widgets上的TextLabe,
再添加一个按钮,PushButton,
将textLabel1的Text设为“Hello World”,pushButton1的Text设为“关闭”。接下来为关闭按钮添加事件,选择菜单Edit->Connections...,弹出View and Edit Connections窗口,
点击按钮“New”在新增项中,Sender选择pushButton1,Signal选择Clicked(),Receiver选择Form1,Slot选择Close(),确定然后保存,
到这里,基本就快完成我们的Hello World了,我们还需要一个main.cpp文件,点击菜单File->new,选择C++ main file(main.cpp)
文件名filename:main.cpp,程序主窗Main-Form:Form,确定,Qt会自动生成main.cpp文件代码,
#include <qapplication.h> #include "form1.h"
int main( int argc, char ** argv ) { QApplication a( argc, argv ); Form1 w; w.show(); a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); return a.exec(); } |
好了,到这里我们的第二个Hello World程序设计完了。保存项目,然后编译程序:
qmake helloworld.pro make ./helloworld |
如果您保存的项目名称是hellowrold.pro就可以用上面的命令编译了。Qmake helloworld.pro先生成Makefile,make开始编译程序,编译完后我们就可以运行我们的程序了。./helloworld运行,
点击“关闭”按钮,关闭程序。
2.2本章小节
本章通过两个简单例子带你走入Qt世界,如果你已经是位C/C++程序员,你会发现Qt将会非常容易上手,本章的二个简单的例子,讲述了如何使用Qt Designer来快速的建立应用程序。其中第二个例子中介绍了如何新建窗口,添加组件,并如何设置它们。上面的两个例子,主要使用了Qt以下两个类(Class):
QApplication类
QApplication类管理图形用户界面应用程序的控制流和主要设置,
公有成员
QApplication ( int & argc, char ** argv )
QApplication ( int & argc, char ** argv, bool GUIenabled )
enum Type { Tty, GuiClient, GuiServer }
QApplication ( int & argc, char ** argv, Type type )
QApplication ( Display * dpy, HANDLE visual = 0, HANDLE colormap = 0 )
QApplication ( Display * dpy, int argc, char ** argv, HANDLE visual = 0, HANDLE colormap = 0 )
virtual ~QApplication ()
int argc () const
char ** argv () const
Type type () const
enum ColorSpec { NormalColor = 0, CustomColor = 1, ManyColor = 2 }
QWidget * mainWidget () const
virtual void setMainWidget ( QWidget * mainWidget )
virtual void polish ( QWidget * w )
QWidget * focusWidget () const
QWidget * activeWindow () const
int exec ()
void processEvents ()
void processEvents ( int maxtime )
void processOneEvent ()
bool hasPendingEvents ()
int enter_loop ()
void exit_loop ()
int loopLevel () const
virtual bool notify ( QObject * receiver, QEvent * e )
void setDefaultCodec ( QTextCodec * codec )
QTextCodec * defaultCodec () const
void installTranslator ( QTranslator * mf )
void removeTranslator ( QTranslator * mf )
enum Encoding { DefaultCodec, UnicodeUTF8 }
QString translate ( const char * context, const char * sourceText, const char * comment = 0, Encoding encoding = DefaultCodec ) const
virtual bool macEventFilter ( EventRef )
virtual bool winEventFilter ( MSG * )
virtual bool x11EventFilter ( XEvent * )
int x11ProcessEvent ( XEvent * event )
virtual bool qwsEventFilter ( QWSEvent * )
void qwsSetCustomColors ( QRgb * colorTable, int start, int numColors )
void winFocus ( QWidget * widget, bool gotFocus )
bool isSessionRestored () const
QString sessionId () const
virtual void commitData ( QSessionManager & sm )
virtual void saveState ( QSessionManager & sm )
void wakeUpGuiThread ()
void lock ()
void unlock ( bool wakeUpGui = TRUE )
bool locked ()
bool tryLock ()
公有槽
void quit ()
void closeAllWindows ()
相关函数
void qAddPostRoutine ( QtCleanUpFunction p )
const char * qVersion ()
bool qSysInfo ( int * wordSize, bool * bigEndian )
void qDebug ( const char * msg, ... )
void qWarning ( const char * msg, ... )
void qFatal ( const char * msg, ... )
void qSystemWarning ( const char * msg, int code )
void Q_ASSERT ( bool test )
void Q_CHECK_PTR ( void * p )
QtMsgHandler qInstallMsgHandler ( QtMsgHandler h )
它包含主事件循环,在其中来自窗口系统和其它资源的所有事件被处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。它也处理绝大多数系统范围和应用程序范围的设置。
对于任何一个使用Qt的图形用户界面应用程序,都正好存在一个QApplication对象,而不论这个应用程序在同一时间内是不是有0、1、2或更多个窗口。
QApplication对象是可以通过全局变量qApp访问。它的负责的主要范围有:
它使用用户的桌面设置,例如palette()、font()和doubleClickInterval()来初始化应用程序。如果用户改变全局桌面,例如通过一些控制面板,它会对这些属性保持跟踪。
它执行事件处理,也就是说它从低下的窗口系统接收事件并且把它们分派给相关的窗口部件。通过使用sendEvent()和postEvent(),你可以发送你自己的事件到窗口部件。
它分析命令行参数并且根据它们设置内部状态。
它定义了由QStyle对象封装的应用程序的观感。在运行状态下,可以通过setStyle()来改变。
它指定了应用程序如何分配颜色。参考setColorSpec()。
它定义了默认文本编码(请参考setDefaultCodec())并且提供了通过translate()用户可见的本地化字符串。
它提供了一些像desktop()和clipboard()这样的魔术般的对象。
它知道应用程序的窗口。你可以使用widgetAt()来询问在一个确定点上存在哪个窗口部件,得到一个topLevelWidgets()(顶级窗口部件)的列表和通过closeAllWindows()来关闭所有窗口,等等。
它管理应用程序的鼠标光标处理,参考setOverrideCursor()和setGlobalMouseTracking()。
在X窗口系统上,它提供刷新和同步通讯流的函数,可以参考flushX()和syncX()。
它提供复杂的对话管理支持。这使得当用户注销时,它可以让应用程序很好地结束,如果无法终止,撤消关闭进程并且甚至为未来的对话保留整个应用程序的状态。
QPushButton类
QpushButton主要用于命令按钮,
#include <qpushbutton.h>
继承了QButton。
公有成员
² QPushButton ( QWidget * parent, const char * name = 0 )
² QPushButton ( const QString & text, QWidget * parent, const char * name = 0 )
² QPushButton ( const QIconSet & icon, const QString & text, QWidget * parent, const char * name = 0 )
² ~QPushButton ()
² void setToggleButton ( bool )
² bool autoDefault () const
² virtual void setAutoDefault ( bool autoDef )
² bool isDefault () const
² virtual void setDefault ( bool def )
² virtual void setIsMenuButton ( bool enable ) (废弃)
² bool isMenuButton () const (废弃)
² void setPopup ( QPopupMenu * popup )
² QPopupMenu * popup () const
² void setIconSet ( const QIconSet & )
² QIconSet * iconSet () const
² void setFlat ( bool )
² bool isFlat () const
公有槽
virtual void setOn ( bool )
属性
n bool autoDefault - 推动按钮是否是自动默认按钮
n bool autoMask - 按钮中自动面具特征是否有效(只读)
n bool default - 推动按钮是否是默认按钮
n bool flat - 边缘是否失效
n QIconSet iconSet - 推动按钮上的图标
n bool menuButton - 推动按钮是否有一个菜单按钮在上面(废弃)
n bool on - 推动按钮是否被切换
n bool toggleButton - 按钮是不是切换按钮
推动按钮或者命令按钮或许是任何图形用户界面中最常用到的窗口部件。推动(点击)按钮来命令计算机执行一些操作,或者回答一个问题。典型的按钮有确定(OK)、应用(Apply)、撤销(Cancel)、关闭(Close)、是(Yes)、否(No)和帮助(Help)。
命令按钮是矩形的并且通常显示一个文本标签来描述它的操作。标签中有下划线的字母(在文本中它的前面被“&”标明)表明快捷键,例如:
QPushButton *pb = new QPushButton( "&Download", this ); |
在这个实例中加速键是Alt+D,并且文本标签将被显示为Download。