QT4 Creator下的图形界面编程入门

来源:互联网 发布:网络科学导论 pdf 编辑:程序博客网 时间:2024/06/12 10:16

1) Qt4 creator的使用

新建工程:

进入Applications -> Programming -> Qt Creator,启动Qt Creator,进入File -> New,选择Projects/Qt4 Gui Application,设置工程保存路径和工程类型,就建立好了一个新的图形界面工程。

编译运行工程:

进入Build -> Build All,编译通过后,进入Build -> Run,就可以运行起来程序。另外在Debug菜单下提供了丰富的程序调试功能。

2)     QT提供的常用窗口及控件类

class QWidget:基础窗体类

class QPushButton:命令按钮类

class QFrame:框架窗体类

class QLabel:标签类

3)     信号和槽

信号是在对象内部状态发生改变的时候产生的,是一种特殊类型的函数,当某个事件(如鼠标点击,程序退出,键盘按键,对象属性更改等等)发生的时候就被发射。

槽是对象的成员函数,它既可以像普通函数一样直接调用,也能够和信号关联。

创建和定义用户槽:

在类声明中加入Q_OBJECT宏的调用,

在用户槽的类声明中加入slots(可以是public, protected, private类型之一)关键字,

用原对象编译器MOC由类声明的头文件生成c++可识别代码,如moc-qt4 classDeclare.h –o classDeclare.moc

在类定义文件(cpp文件)中包含上述moc文件或者从moc文件和cpp文件创建目标文件,

在类定义文件中定义用户槽。

创建和使用用户信号:

      在类声明中加入Q_OBJECT宏的调用,

      在用户信号的类声明中加入signals关键字,

      在类定义文件(cpp文件)中事件发生的地方,用emit来发射信号,如emit UserSignal(param)

      在类定义文件中合适的地方(如类的构造函数),用connect将信号和槽关联起来,如connect(this, SIGNAL(UserSignal(param)), this, SLOT(UserSlot(param)))

      在类定义文件中需要的地方,用disconnect将信号和槽断开。

4)     定时器

QT中提供了QTimer类来管理定时器功能,其使用方法如下:

定义一个QTimer对象,如QTimer *timer = new QTimer(this)

connecttimeout信号与定时处理槽关联起来,connect(timer, SIGNAL(timeout()), this, SLOT(TimeoutSlot()))

在类定义文件中定义定时器处理槽,

在需要的地方开启或者关闭定时器,如timer->start(1000)timer->stop()

另外,QObject类已经定义了成员虚函数timerEvent()来处理timeout信号,这样就有如下的方法:

在类定义文件需要的地方,用startTimer()来开启定时器,

重载类的成员虚函数timerEvent()来进行相应的定时器处理,

在类定义文件需要的地方,用killTimer()来关闭定时器。

5)     pro文件的工程设置

利用Qt Creator新建工程,会自动生成工程的编译配置文件 pro文件,此文件会在编译工程时,影响Makefile的内容,通过手工修改pro文件的内容,可以更大限度地扩展Qt Creator的集成开发功能,以下介绍几个重要的字段:

OBJECTS_DIR:用于指定.o文件的输出目录,如OBJECTS_DIR = ./output/

INCPATH:指定源文件中包含文件的搜索路径,如INCPATH += ../MyDir1 ./MyDir2/Dir3

TARGET:指定最终生成可执行文件的名字,如TARGET = ../execDir/execFile

DEFINES:指定工程的预定义宏,如DEFINES += LINUX32 MYDEBUG

HEADERS:工程所编译的头文件

SOURCES:工程所编译的源文件

6)     绘制2D图形

Qt提供了QPainter类来创建用户图形,其使用十分简单和直观。

重载绘图对象的类的成员虚函数paintEvent()

在类定义文件中paintEvent()函数的实现体中调用QPainter::begin()QPainter::end()来启动和停止绘图,将绘图的实现代码放在这二者之间即可,如

void MyDrawWnd::paintEvent(QPaintEvent *qp)

{

   QPushButton::paintEvent(qp);

   QPainter paint;

   paint.begin(this);

   paint.drawEllipse(2, 2, this->width()-4, this->height()-4);

   paint.end();

}