关于Qt

什么是Qt?

Qt是一个跨平台的C++图形界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需要的功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。

Qt支持的平台有:Windows-XP、Win7、Win8、Win2008、Win10、Linux、Mac OS X。

Qt按照不同的版本发行,分为商业版和开源版。Qt商业版为商业软件提供开发环境,它们提供传统商业软件发行版,并且提供在协议有效期内的免费升级版本和技术支持服务。而Qt开源版是为了开发自由而设计的开放源码软件,它提供了和商业版本同样的功能,在GNU通用许可证下,它是免费的。

信号和槽机制

Qt提供了信号和槽机制用于完成界面操作的响应,是完成任意两个Qt对象之间的通信机制。其中,信号会在 某个特定情况或动作下被触发,槽是等同于接收并处理信号的函数。例如,若要将一个窗口部件的变化情况通知给另一个窗口部件,则另一个窗口部件发送信号,另一个窗口部件的槽接收此信号并进行相应的操作,即可实现两个窗口部件之间的通信。每个Qt对象都包含若干个预定义信号和若干个预定义的槽,当某一个特定事件发生时,一个信号被发送,与信号相关联的槽则会响应信号并完成相应的处理。当一个类被继承时,该类的信号和槽同时也被继承,也可以根据需要自定义信号和槽。

1.信号和槽的连接方式

(1)一个信号可以与另一个信号相连

//信号与槽一对一
connect(object1,SIGNAL(signal1),object2,SIGNAL(signal1));
//表示object1的信号signal1发送可以触发object2的信号signal1发送

(2)同一个信号可以与多个槽相连

//信号与槽一对多
connect(object1,SIGNAL(signal1),object2,SIGNAL(slot2));
connect(object1,SIGNAL(signal1),object3,SIGNAL(slot1));

(3)同一个槽可以响应多个信号

//信号与槽多对一
connect(object1,SIGNAL(signal1),object2,SIGNAL(slot2));
connect(object2,SIGNAL(signal1),object2,SIGNAL(slot2));

但是常用的连接方式为:

connect(object1,SIGNAL(signal),object2,SLOT(slot));
//signal为对象object1的信号,slot为对象object2的槽

SIGNAL()和SLOT()是Qt定义的两个宏,它们返回其参数的C语言风格的字符串(const char*)。因此,常常使用的以下两个关联信号和槽的语句是等价的:

connect(button,SIGNAL(clicked()),this,SLOT(showArea()));
connect(button,"clicked()",this,"showArea()");

2.信号与槽机制的优点

(1)类型安全

需要关联的信号和槽的签名必须是等同的,即信号的参数类型和参数个数与接收该信号的槽的参数类型和参数个数相同。不过,一个槽的参数个数是可以少于信号的参数个数的,但缺少的参数必须是信号参数的最后一个或几个参数。如果信号和槽的签名不符,编译器就会报错。

(2)松散耦合

信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无须知道是哪个对象的哪个槽需要接收它发出的信号,它只需要做的是在适当的时间发送适当的信号就可以了,而不需要知道也不关心它的信号有没有被接收到,更不需要知道是哪个对象的哪个槽接收到了信号。同样,对象的槽也不知道是哪些信号关联了自己,而一旦关联信号和槽,Qt就保证了适合的槽得到了调用。即使关联的对象在运行时被删除,应用程序也不会崩溃。一个类若要支持信号和槽,就必须从QObject或QObject的子类继承。但是需要注意的是,Qt信号和槽机制不支持对模板的使用。

3.信号与槽机制的效率

信号和槽机制增强了对象间通信的灵活性,然而这也损失了一些性能。同回调函数相比,信号和槽机制运行速度虽然有些慢。通常,通过传递一个信号来调用槽函数将会比直接调用非虚函数运行速度慢10倍,主要原因为:

(1)需要定位接收信号的对象

(2)安全的遍历所有的关联(如一个信号关联多个槽的情况)

(3)编组/解组传递的参数

(4)多线程的时候,信号可能需要排队等候

然而,与创建堆对象的new操作及删除堆对象的delete操作相比,信号和槽的运行代价只是它们很少的一部分。信号和槽机制导致的这点性能损耗,对实时应用程序是可以忽略的;同信号和槽提供的灵活性和简便性相比,这点性能的损失也是值得的。

 双缓冲机制

原理:所谓双缓冲机制,即在绘制控件时,首先将要绘制的内容绘制在一个图片中,再将图片一次性地绘制到控件上。在早期的Qt版本中,若直接在控件上进行绘制工作,则在控件重绘时会产生闪烁的现象。当所需绘制的内容较复杂并且需要不断刷新时,或者每次只需要刷新整个控件的一小部分时,应采用双缓冲机制。

Qt操作数据库

Qt提供的QtSql模块实现了对数据库的访问,同时提供了一套与平台和具体所用数据库均无关的调用接口。此模块为不同层次的用户提供了不同丰富的数据库操作类。形目中通常采用各种数据库(如Oracle、SQL Server、MySQL等)来实现对数据的存储、检索等功能。这些数据库除了提供基本的查询、删除和添加等功能外还提供很多高级特性,如触发器、存储过程、数据备份恢复和全文检索功能等。但实际上很多应用仅利用了这些数据库的基本特性,而在某些特殊场合的应用中,这些数据库明显有些臃肿。于是Qt提供了一种进程内数据库SQLite,小巧灵活,无须额外安装配置且支持大部分ANSI SQL92标准,是一个轻量级的数据库,具有如下优点:

(1)SQLite的设计目的是嵌入式SQL数据库引擎,它基于纯C语言代码,已经用于非常广泛的领域内。

(2)SQLite在需要持久存储时可以直接读写硬盘上的数据文件,在无须持久存储时也可以将整个数据库置于内存中,两者均不需要额外的服务器端进程,即SQLite是无须独立运行的数据库引擎。

(3)开放源代码,整个代码少于3万行,有良好的注释和90%以上的测试覆盖率。

(4)少于250KB的内存内存占用容量。

(5)支持视图、触发器和事务,支持嵌套SQL功能。

(6)提供虚拟机用于处理SQL语句。

(7)不需要配置,不需要安装,也不需要管理员。

(8)支持大部分ANSI SQL92标准。

(9)大部分应用的速度比目前常见的客户端/服务器结构的数据库快。

(10)编程接口简单易用。

在持久存储的情况下,一个完整的数据库就对应于磁盘上面的一个文件,它是一种具备了基本数据库特性的数据文件。同一个数据文件可以在不同机器上使用,可以在不同字节序的机器间自由共享。最大共享2TB数据容量,而且性能仅受限于系统的可用内存。没有其他依赖,可以应用于多种操作系统平台。

如果不使用外部数据库,直接使用SQLite的话,那么数据库的连接方式为:

QSqlDatabase m_DB=QSqlDatabase::addDatabase("QSQLITE");//驱动
m_DB.setHostName("easybook-3313b0");//服务器名称
m_DB.setDatabaseName("qtDB.db");//数据库名
m_DB.setUserName("sa");//设置数据库用户名
m_DB.setPassword("123456");//设置数据库密码
m_DB.open();//打开连接

 我在项目中使用的是SQL Server数据库,那么连接步骤为:

m_DB=QSqlDatabase::addDatabase("QODBC");//驱动
m_DB.setHostName("(local)\\SqlExpress");//服务器名称
QString dsn=QString("DRIVER={SQL SERVER};SERVER=%1;DATABASE=%2;").arg("(local)\\SqlExpress").arg("CM");
m_DB.setDatabaseName(dsn);
m_DB.setUserName("sa");
m_DB.setPassword("123456");
m_DB.open();

Qt支持的数据库驱动插件

驱动

数据库

QDB2

IBM DB2及其以上版本

QIBASE

Borland InterBase

QMYSQL

MySQL

QOCI

Oracle Call Interface Driver

QODBC

Open DataBase Connectivity(ODBC)包括微软SQL Server和其他ODBC兼容数据库

QPSQL

PostgreSQL版本6.x和7.x

QSQLITE

SQLite版本3及其以上版本

QSQLITE2

SQLite版本2

QTDS

Sybase Adaptive Server

根据上表,如果要使用MySQL数据库时,则需要加载的驱动为(“QMYSQL”),SQL Server的驱动为(“QODBC”)。

QMainWindow

QMainWindow是一个为用户提供主窗口程序的类,包含一个菜单栏(menu bar)、多个工具栏(tool bar)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget),是许多应用程序的基础,如文本编辑器、图片编辑器等。

菜单栏是一系列命令的列表。为了实现菜单、工具栏按钮、键盘快捷方式等命令的一致性,Qt使用动作(Action)来表示这些命令。Qt的菜单就是有由一系列的QAction动作对象构成的列表,而菜单栏则是包容菜单的面板,它位于主窗口顶部、主窗口标题栏的下面。一个主窗口最多只有一个菜单栏。

状态栏通常显示GUI应用程序的一些状态信息,它位于主窗口的底部。用户可以在状态栏上添加、使用Qt窗口部件。一个主窗口最多只有一个状态栏。

工具栏是由一系列的类似于按钮的动作排列而成的面板,它通常由一些经常使用的命令组成。工具栏位于菜单栏的下面、状态栏的上面,可以停靠在主窗口的上下左右四个方向上。一个主窗口可以包含多个状态栏。

锚接部件作为一个容器使用,以包含其他窗口部件来实现某些功能。例如,Qt设计器的属性编辑器、对象监视器等都是由锚接部件包含其他的Qt窗口部件来实现的。它位于工具栏的内部,可以作为一个窗口自由的浮动在主窗口上面,也可以像工具栏一样停靠在主窗口的上下左右四个方向上。一个主窗口可以包含多个锚接部件。

中心部件处在锚接部件区的内部、主窗口的中心。一个主窗口只有一个中心部件。

 为了控制主窗口工具栏和锚接部件的显隐,在默认情况下,QMainWindow主窗口提供了一个上下文菜单(Context Menu)。通常通过在工具栏或锚接部件上单击鼠标右键就可以激活该上下文菜单,也可以通过函数QMainWindow::createPopupMenu()激活该菜单。此外,还可以重写QMainWindow::createPopupMenu()函数实现自定义的上下文菜单。

QDialog

QDialog类是对话窗口的基类。其子类包括标准文件对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框(QFontDialog)、标准输入对话框(QInputDialog)和标准消息对话框(QMessageBox)。对话窗口是一个顶层窗口,主要用于与用户进行简短交互,如果设置了父窗口,其显示的位置会在父窗口的中心。

QWidget

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

QWidget有很多成员函数,但是它们中的一些有少量的直接功能:例如,QWidget有一个字体属性,但是它自己从来不用。有很多继承它的子类提供了实际的功能,比如QPushButton、QListBox和QTabDialog等等。每一个窗口部件构造函数接受两个或三个标准参数:QWidget *parent = 0是新窗口部件的父窗口部件。如果为0(默认),新的窗口部件将是一个顶级窗口部件。如果不是,它将会是parent的一个孩子,并且被parent的几何形状所强迫(除非你指定WType_TopLevel作为窗口部件标记)。

参考自:https://blog.csdn.net/x348722662/article/details/50947517/#qwidget

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值