Qt入门实例

  • 格式:pdf
  • 大小:204.97 KB
  • 文档页数:5

Qt⼊门实例

⼀、基于Qt设计师1.创建⼀个GUI项⽬,选择“Qt4 Gui Application”。其中还有Empty Qt4 Project(空的⼯程),Qt4 Console Applicaiton(基于控制台的⼯程),Qt4Gui Application(基于GUI设计的⼯程)。

2.填写好项⽬名称和⽬录后,单击下⼀步可以⾃⼰添加⼀些功能模块。⽐如QtOpenGl,QtNetwork,Qtsql等等。

3.单击下⼀步,选择Base class(基类主要三种选择:QWidget为窗⼝部件,QMaindow为主窗⼝,QDialog为对话框)。其它如Classname,Header file,Source file,Form file均可根据⾃⼰需要⾃⾏修改。选中Generate form复选框,表⽰要⽤⾃带的界⾯设计器来设计界⾯,否则需要⽤代码完成界⾯设计。最后单击Finish按钮,完成创建,则相应的⽂件⾃动加载到⽂件列表中去。4.双击Dialog.ui,则进⼊Qt Designer。

5.进⼊程序代码⽂件

先看Dialog.h头⽂件

#ifndef DIALOG_H

#define DIALOG_H

#include

//⽤namespace定义⼀个全局名称空间Ui(也可以称为域,类似于C语⾔中的全局变量),⽤于解决在程序中存在同名标识存在的潜在危机。在名称空间中可以封装⼀些函数、类以及数据成员,⽤于细化管理。//当在源⽂件中使⽤这个全局空间内成员时,有两种⽅法:第⼀种为直接在成员名前⾯加上作⽤域如Ui::Dialog表⽰使⽤Ui域中的Dialog类;第⼆种则在程序开头加上using namespace Ui,声明使⽤作⽤域Ui,则可直接使⽤Dialog类。namespace Ui {class Dialog;} //在ui_dialog.h⽂件中定义了命名空间Ui,其中还定义了⼀个继承⾃Ui_Dialog类的Dialog类。这⾥只是对Ui域中Dialog类的前置声明,以便加快编译速度,同时避免在⼀个头⽂件中随意包含其他头⽂件⽽产⽣错误,⽽这⾥只使⽤了该类对象的指针,不需要该类的完整定义,因此可以使⽤前置声明。class Dialog : public QDialog //定义⼀个QDialog的派⽣类(公有继承)

{

Q_OBJECT //宏名,这个宏必须出现在类的私有声明区,以启动元对象QOject的特性(元对象编译器moc)

public:

explicit Dialog(QWidget *parent = 0);

//parent指定Dialog的⽗窗⼝部件,parent=0表⽰窗⼝部件为⼀个窗⼝,否则为parent的⼦窗⼝控件 //构造函数,explicit只对构造函数起作⽤,⽤来抑制隐式转换(默认为隐式转换,explicit可以有效得防⽌构造函数的隐式转换带来的错误或者误解) //按照默认规定,只有⼀个参数的构造函数也定义了⼀个隐式转换(如QString s = "hello"经过隐式转换,等价于QString s=QString("hello")或者QString s("hello")),将该构造函数对应数据类型的数据转换为该类对象。⽽explicit则不允许QString s="hello"这种初始化⽅式,使得编译不能通过。 ~Dialog(); //析构函数

private slots:

void on_countBtn_clicked();//单击按钮显⽰圆⾯积

//void on_radiuslineEdit_textChanged(const QString &arg1);//在lineEdit控件中输⼊圆的半径,在areaLabel_2中直接显⽰出圆的⾯积

private:

Ui::Dialog *ui; //定义⼀个私有成员的Ui::Dialog类指针成员,注意此时Ui:: Dialog与继承于QDialog类的⼦类Dialog是不同的类,因为它们属于不同的域(即不同的全局名称空间),在cpp⽂件中会⽤ui->setupUi函数将UI⽂件中的界⾯应⽤于Dialog类的对象。};

#endif //DIALOG_H

再看Dialog.cpp源⽂件

#include "dialog.h"

#include "ui_dialog.h"

const static double PI=3.1416; //定义⼀个全局变量

Dialog::Dialog(QWidget *parent) : //构造函数(带有⼀个QWidget指针型参数)

QDialog(parent), //调⽤基类构造函数初始化基类QDialog,表⽰⼦类Dialog将⽗窗⼝参数传递给基类,说明也为QDialog的⽗窗⼝

ui(new Ui::Dialog) //在构造函数中⽤new为指针成员开辟独⽴的动态内存空间,这⾥是为Dialog类中Ui::Dialog类对象成员ui开辟内存空间

{

ui->setupUi(this); //在头⽂件中定义的Ui::Dialog类指针成员,在这⾥进⾏初使化ui,在产⽣界⾯后,setupUi()会根据naming convention对slot进⾏连接

}

Dialog::~Dialog() //析构函数

{

delete ui; //在析构函数中⽤delete释放构造函数中⽤new开辟的动态内存空间,因为ui没有⽗窗⼝,只有那些没有parent的物件才使⽤delete来消除

}

//单击按钮显⽰圆⾯积,这个是在界⾯设计时右键按钮控件,然后单击“go to slot(转到槽)”产⽣的槽函数

void Dialog::on_countBtn_clicked()

{

bool ok;

QString tempStr;

QString valueStr=ui->radiuslineEdit->text();

int valueInt=valueStr.toInt(&ok);

double area=valueInt*valueInt*PI;

ui->areaLablel_2->setText(tempStr.setNum(area));}

/////////////////////////////////////////////////////////////////

//在lineEdit控件中输⼊圆的半径,在areaLabel_2中直接显⽰出圆的⾯积

void Dialog::on_radiuslineEdit_textChanged(const QString &arg1)

{

bool ok;

QString tempStr;

QString valueStr=ui->radiuslineEdit->text();

int valueInt=valueStr.toInt(&ok);

double area=valueInt*valueInt*PI;

ui->areaLablel_2->setText(tempStr.setNum(area));

}

////////////////////////////////////////////////////////////////

最后看main.cpp源⽂件

#include //在每⼀个使⽤Qt图形化应⽤程序中必须使⽤⼀个QApplication对象,它管理了图形化应⽤程序的⼴泛资源,基本设置,控制流及事件处理#include "dialog.h" //完成dialog类的定义,注意使⽤哪个类时就必须将包含该类的头⽂件引⽤过来

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

{

QApplication a(argc, argv); //a是QApplication类的实例对象,任何Qt的窗⼝系统部件被使⽤之前必须⼀ 个创建QApplication对象

Dialog w; //创建⼀个对话框对象,即Dialog实例对象

w.show(); //在创建⼀个窗⼝部件的时候,默认是不可见的,必须⽤shou()函数使之变成可见

return a.exec(); //程序进⼊消息循环,等待可能输⼊进⾏响应。这⾥就是main()把控制权转交给Qt,Qt完成事件处理后,当应⽤程序退出时,exec()的值就会返回。//在exec()中,Qt接受并处理⽤户和系统的事件并且把它们传递给适当的窗⼝部件

}

7.运⾏程序

⼆、完全⽤编写代码的⽅式1.创建项⽬与⽤Designer设计⼤体相同,只是要取消选中Generate form复选框。

2.进⼊程序代码⽂件

先看Dialog.h头⽂件

#ifndef DIALOG_H

#define DIALOG_H

#include //添加⽤到的头⽂件

#include //添加⽤到的头⽂件

#include //添加⽤到的头⽂件

#include //添加⽤到的头⽂件class Dialog : public QDialog //类Dialog为基类QDialog的派⽣类(公有继承)

{

Q_OBJECT //这个宏的作⽤是启动Qt元对象系统的⼀些特性,如⽀持信号和槽,必须放置到类定义的私有区

public:

Dialog(QWidget *parent = 0); //构造函数,这⾥没有⽤explicit来抑制构造函数的隐式转换。parent指定Dialog的⽗窗⼝部件,parent=0表⽰窗⼝部件为⼀个窗⼝,否则为parent的⼦窗⼝部件

~Dialog();

private: //添加私有窗⼝部件变量

QLabel *label1,*label2; //添加QLabel类的指针型控件

QLineEdit *lineEdit; //添加QLineEdit类的指针型控件

QPushButton *button; //添加QPushButton类的指针型控件

private slots: //添加私有槽函数

void showArea();

};

#endif // DIALOG_H

再看Dialog.cpp源⽂件

#include "dialog.h"

#include //添加使⽤到的头⽂件,也可以写成#include "QGridLayout.h"

const static double PI=3.1416; //添加全局变量

Dialog::Dialog(QWidget *parent) //构造函数

: QDialog(parent)

{

label1=new QLabel(this); //这⾥的this指定⽗窗⼝

label1->setText(tr("请输⼊圆的半径:"));//QObject::tr()

lineEdit=new QLineEdit(this);

label2=new QLabel(this);

button=new QPushButton(this);

button->setText(tr("显⽰对应圆的⾯积"));

QGridLayout *mainLayout=new QGridLayout(this);//⽹格布局

mainLayout->addWidget(label1,0,0);