Qt入门实例
一、基于Qt设计师
1.创建一个GUI项目,选择“Qt4 Gui Application”。其中还有Empty Qt4 Project(空的工程),Qt4 Console Applicaiton(基于控制台的工程),Qt4 Gui Application(基于GUI设计的工程)。
2.填写好项目名称和目录后,单击下一步可以自己添加一些功能模块。比如QtOpenGl,QtNetwork,Qtsql等等。
3.单击下一步,选择Base class(基类主要三种选择:QWidget为窗口部件,QMaindow为主窗口,QDialog为对话框)。其它如Class name,Header file,Source file,Form file均可根据自己需要自行修改。选中Generate form复选框,表示要用自带的界面设计器来设计界面,否则需要用代码完成界面设计。最后单击Finish按钮,完成创建,则相应的文件自动加载到文件列表中去。
4.双击Dialog.ui,则进入Qt Designer。
5.进入程序代码文件
先看Dialog.h头文件
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
//用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 <QtGui/QApplication> //在每一个使用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 <QtGui/QDialog> //添加用到的头文件
#include <QLabel> //添加用到的头文件
#include <QLineEdit> //添加用到的头文件
#include <QPushButton> //添加用到的头文件
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 <QGridLayout>//添加使用到的头文件,也可以写成#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);
mainLayout->addWidget(lineEdit,0,1);
mainLayout->addWidget(label2,1,0);
mainLayout->addWidget(button,1,1);
setLayout(mainLayout);
connect(button,SIGNAL(clicked()),this,SLOT(showArea()));//单击按钮显示圆面积
//connect(lineEdit,SIGNAL(textChanged(QString)),this,SLOT(showArea()));//当行编辑控件中输入半径时,不必单击按钮,直接在label2中显示出面积
}
Dialog::~Dialog() //析构函数
{
}
void Dialog::showArea() //添加的槽函数
{
bool ok;
QString tempStr;
QString valueStr=lineEdit->text();
int valueInt=valueStr.toInt(&ok);
double area=valueInt*valueInt*PI;
label2->setText(tempStr.setNum(area));
}
最后看main.cpp源文件
#include <QtGui/QApplication>
#include "dialog.h"
#include <QTextCodec> //人为添加使用的头文件
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
//使用tr()函数将字符串翻译成本地字符编码类型,用于解决中文乱码问题,使用UI界面设计时则不需要,在ui_xxx.h中自动将汉字转化成utf8编码格式
//QTextCodec::setCodecForLocale (QTextCodec::codecForLocale());
//使用QString::fromLocal8Bit()将字符串翻译成本地字符编码类型
//QTextCodec::setCodecForCStrings (QTextCodec::codecForLocale());
//使用QString ()将字符串翻译成本地字符编码类型
Dialog w;
w.show();
return a.exec();
}
Qt入门实例的更多相关文章
- Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装
转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...
- QT入门学习笔记2:QT例程
转至:http://blog.51cto.com/9291927/2138876 Qt开发学习教程 一.Qt开发基础学习教程 本部分博客主要根据狄泰学院唐老师的<QT实验分析教程>创作,同 ...
- 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...
- React 入门实例教程(转载)
本人转载自: React 入门实例教程
- struts入门实例
入门实例 1 .下载struts-2.3.16.3-all .不摆了.看哈就会下载了. 2 . 解压 后 找到 apps 文件夹. 3. 打开后将 struts2-blank.war ...
- Vue.js2.0从入门到放弃---入门实例
最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...
- wxPython中文教程入门实例
这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下 wxPython中文教程入门实例 wx.Window 是一个基类 ...
- Omnet++ 4.0 入门实例教程
http://blog.sina.com.cn/s/blog_8a2bb17d01018npf.html 在网上找到的一个讲解omnet++的实例, 是4.0下面实现的. 我在4.2上试了试,可以用. ...
- Spring中IoC的入门实例
Spring中IoC的入门实例 Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如 ...
随机推荐
- 关于 ssh 连接较慢的解决办法
1. 概述 使用 ssh 软件连接 linux 时, 会碰到很慢的情况 2. 场景 概述 ssh 连接很慢 大概步骤 使用 xshell6 免费版, 连接 主机 一个小等待, 弹出 用户名 输入框 输 ...
- python脚本 mongodb到postgresql
安装 mongo模块 pip install pymongo 安装postgresql 驱动 pip install python-psycopg2 1 # -*- coding: utf-8 -* ...
- Map,Hashmap,LinkedHashMap,Hashtable,TreeMap
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对, ...
- 从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1
原文:从PRISM开始学WPF(八)导航Navigation-更新至Prism7.1 0x6Navigation [7.1updated] Navigation 在wpf中并没有变化 Basic Na ...
- CDN 缓存策略(转)
1.CDN加速原理 通过动态域名解析,网友的请求被分配到离自己最快的服务器.CDN服务器直接返回缓存文件或通过专线代理原站的内容. 网络加速+内容缓存,有效提供访问速度 2.CDN节点数量 ...
- SpringBoot入门(四)——自动配置
本文来自网易云社区 SpringBoot之所以能够快速构建项目,得益于它的2个新特性,一个是起步依赖前面已经介绍过,另外一个则是自动配置.起步依赖用于降低项目依赖的复杂度,自动配置负责减少人工配置的工 ...
- selenium元素定位(三)
使用selenium就不可避免的要提到界面元素定位,通过元素定位来实现一系列的逻辑操作. selenium提供了8中元素定位的方式: id.name.class name.tag name.link ...
- 【WXS全局对象】Number
属性: 名称 说明 Number.MAX_VALUE 返回JS中可表示的最大的数.它的近似值为 1.7976931348623157 x 10308. Number.MIN_VALUE 返回JS中可表 ...
- 数据库Mysql的学习(一)-启动和进入
数据库:按照数据结构来组织储存和管理数据的仓库. Mysql是关系型数据库管理系统 Mysql安装好之后... mysql的启动 1:通过控制面板里的”服务“找到mysql右键启动即可 2:开始菜单搜 ...
- 饥饿的小易(枚举+广度优先遍历(BFS))
题目描述 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃.最开始小易在一个初始位置x_0.对于小易所处的当前位置x,他只能通过神秘的力量移动到 4 * x + 3或者8 * x + 7.因为使 ...