Qt GUI@学习日志
day 1:
Qt中类:
理解一个类最好还是从其类代码实现上看。
由此图可看出需要好好研究那几个重要的类:Qt/QEvent/QObject/QWidget/。
QApplication: (比较复杂,且很常用)
- 它使用用户的桌面设置,例如palette()、font()和doubleClickInterval()来初始化应用程序。如果用户改变全局桌面,例如通过一些控制面板,它会对这些属性保持跟踪。
- 它执行事件处理,也就是说它从低下的窗口系统接收事件并且把它们分派给相关的窗口部件。通过使用sendEvent()和postEvent(),你可以发送你自己的事件到窗口部件。
- 它分析命令行参数并且根据它们设置内部状态。关于这点的详细情况请参考下面的构造函数文档。
- 它定义了由QStyle对象封装的应用程序的观感。在运行状态下,可以通过setStyle()来改变。
- 它指定了应用程序如何分配颜色。详细情况请参考setColorSpec()。
- 它定义了默认文本编码(请参考setDefaultCodec())并且提供了通过translate()用户可见的本地化字符串。
- 它提供了一些像desktop()和clipboard()这样的魔术般的对象。
- 它知道应用程序的窗口。你可以使用widgetAt()来询问在一个确定点上存在哪个窗口部件,得到一个topLevelWidgets()(顶级窗口部件)的列表和通过closeAllWindows()来关闭所有窗口,等等。
- 它管理应用程序的鼠标光标处理,请参考setOverrideCursor()和setGlobalMouseTracking()。
- 在X窗口系统上,它提供刷新和同步通讯流的函数,请参考flushX()和syncX()。
- 它提供复杂的对话管理支持。这使得当用户注销时,它可以让应用程序很好地结束,如果无法终止,撤消关闭进程并且甚至为未来的对话保留整个应用程序的状态。详细情况请参考isSessionRestored()、sessionId()、commitData()和saveState()。
app.exec();
进入主事件循环并且等待,直到exit()被调用或者主窗口部件被销毁,并且返回值被设置为exit()(如果通过quit(),exit()被调用,为0)。
QLabel: 提供文本和图片的显示功能。还可以设置显示格式等。
QObject: 是所有Qt对象的基类。
QMainWindow: 提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围菜单、工具条和一个状态条。QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态变得更容易。继承使创建当用户点击菜单项或者工具条按钮时被调用的槽成为可能。
QWidget: QWidget类是所有用户界面对象的基类。
- 窗口部件是用户界面的一个原子:它从窗口系统接收鼠标、键盘和其它事件,并且在屏幕上绘制自己的表现。每一个窗口部件都是矩形,并且它们按Z轴顺序排列的。一个窗口部件可以被它的父窗口部件或者它前面的窗口部件盖住一部分。
- QDialog是最普通的顶级窗口。不被嵌入到一个父窗口部件的窗口部件被叫做顶级窗口部件。通常情况下,顶级窗口部件是有框架和标题栏的窗口(尽管如果使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装饰。)在Qt中,QMainWindow和和不同的QDialog的子类是最普通的顶级窗口。
- 一个没有父窗口部件的窗口部件一直是顶级窗口部件。
- 非顶级窗口部件是子窗口部件。它们是它们的父窗口部件中的子窗口。你通常不能在视觉角度从它们的父窗口部件中辨别一个子窗口部件。在Qt中的绝大多数其它窗口部件仅仅作为子窗口部件才是有用的。(当然把一个按钮作为或者叫做顶级窗口部件也是可能的,但绝大多数人喜欢把他们的按钮放到其它按钮当中,比如QDialog。)
- QWidget有很多成员函数,但是它们中的一些有少量的直接功能:例如,QWidget有一个字体属性,但是它自己从来不用。有很多继承它的子类提供了实际的功能,比如QPushButton、QListBox和QTabDialog等等。
C++父类与子类转换
QMainWindow *mw = new QMainWindow;
QTextEdit *edit = new QTextEdit( mw, "editor" ); //子类类型强制转换为父类类型
//mw是QMainWindow类型,继承自QWidget,但是mw位子要求QWidget*
edit->setFocus();
mw->setCaption( "Main Window" );
mw->setCentralWidget( edit );
mw->show();
子类可以转换为父类,但是父类不可转换为子类(想想继承的过程就明白了);子类转换为父类,子类特有的数据丢失。
如果父类对象的引用指向的实际是一个子类的对象,那么父类对象的引用可以强制转化成子类对象的引用。如:
Parent p=new Son() //父类对象引用指向子类的对象;
Son s=(Son)p; --正确
Parent p=new Parent() //父类对象引用指向父类的对象;
Son s=(Son)p; --错误
Day 2
总结一下上次分析的QWidget/QDialog/QMainWindow的使用:当要创建一个程序组件时,选择QWidget;创建对话框窗口的时候选择QDialog;创建程序主界面窗口时,选择QMainWindow。
QLabel: 显示文本或者图片
QLineEdit: 单行文本输入框
QCheckBox: 带有文本标签的编辑框
QPushButton: 按键
QLabel::setBuddy(); 设置输入焦点的位置,当快捷键按下后,转到此焦点位置。
如:label=new QLabel(tr("Find &what")); //&:表示取w作为快捷键
lineEdit=new QLineEdit;
label->setBuddy(lineEdit); //设置label
窗口布局:
QHBoxLayout: 组件水平方向的线性排列。
QVBoxLayout: 组件垂直方向的线性排列。
Qt::StringComparisonMode
Qt::CaseSensitivity cs=caseCheckBox->ischecked()?Qt::CaseInsensitive : Qt::CaseSensitive; //匹配的灵敏度
//分别表示是否区分大小写
头文件包含
#include <QtGui>
#include <QtCore>
关于这两个文件的详细内容详看库的 ../include/QtGui/QtGui 和 ../include/QtCore/QtCore 两个文件,实际上是包含了Qt开发的所有的头文件。但是实际的工程中最好是用到哪个就添加哪个,添加需要的头文件可以使用SourceInsight查找库中的相关定义。
参考:http://blog.csdn.net/lyc_daniel/article/details/12103189
Q_OBJECT:
The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.
void QWidget::resizeEvent ( QResizeEvent * event ) [virtual protected]
This event handler can be reimplemented in a subclass to receive widget resize events which are passed in the event parameter. When resizeEvent() is called, the widget already has its new geometry. The old size is accessible through QResizeEvent::oldSize().
通过接收resize event,改变空间的几何结构。
Qt事件种类以及处理方法
事件(event)是由系统或者Qt本身在不同的时刻发出的。当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在对用户操作做出响应的时候发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。
在所有组件的父类QWidget中,定义了很多事件处理函数,如keyPressEvent()、keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、mousePressEvent()、mouseReleaseEvent()等。这些函数都是protected virtual的,也就是说,我们应该在子类中重定义这些函数。
(不过经常使用的是这些事件的重载函数)
想要弄明白Qt中从事件的触发到时间的处理是怎样一个过程,但是查遍了好像都没地方将的很清楚,但大概是:系统或者Qt产生一个事件,然后QWidget的event()函数会检测到事件的发生,然后将事件传递给特定的事件处理器,时间处理器做相应的处理。
intQKeyEvent::key () const
Returns the code of the key that was pressed or released.
See Qt::Key for the list of keyboard codes. These codes are independent of the underlying window system.
事件处理的方式:
1. 事件处理器函数重载
2. 重新实现QObject::event()函数:QObject实例在看到它自己的事件之前,可以先通过设置另外一个QObeject实例先监视这些事件,这种方法可以用来覆盖已定义事件的默认处理方式,也可以用来处理Qt中尚未定义特定事件处理器的事件。
QString str;
str = QString("Decimal 63 is %1 in hexadecimal")
.arg(63, 0, 16);
// str == "Decimal 63 is 3f in hexadecimal"
QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
str = QString("%1 %L2 %L3")
.arg(12345)
.arg(12345)
.arg(12345, 0, 16);
// str == "12345 12,345 3039"
Qt GUI@学习日志的更多相关文章
- Qt的学习资料比起其它C/C++的GUI组件来说已经算很全的了
Qt的学习资料比起其它C/C++的GUI组件来说已经算很全的了.Google的话能解决很多问题,如果没搜到资料的话,如果不是问题太过具体或者奇葩,那就是搜索方法的问题.中文教程中,Qt学习之路系列很不 ...
- QT入门学习笔记2:QT例程
转至:http://blog.51cto.com/9291927/2138876 Qt开发学习教程 一.Qt开发基础学习教程 本部分博客主要根据狄泰学院唐老师的<QT实验分析教程>创作,同 ...
- 保持Qt GUI响应的几种方法
最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...
- [转] Qt 多线程学习
Qt 多线程学习 转自:http://www.cnblogs.com/IT-BOY/p/3544220.html 最近的项目上用到了关于多线程的知识,自己也比较感兴趣,所以就拿了那本<C++ G ...
- 自己的Qt GUI 项目+vs2013+opencv+caffe环境配置
由于深度学习的种种优势,使我们对于深度学习的使用越来越频繁.很多时候,我们都需要在自己的项目中配置caffe环境,来调用caffe网络模型完成自己的任务.今天我主要讲的关于"在自己的项目中配 ...
- PyQt(Python+Qt)学习随笔
老猿Python博文目录 老猿Python博客地址 PyQt学习随笔 PyQt(Python+Qt)帮助文档官网及文档下载 PyQt(Python+Qt)学习随笔:PyQt帮助文档导入assistan ...
- Qt设计师学习笔记--Sharping-Changing Dialogs
1.pushbutton->default属性为true,按回车相当于点击该按钮. 2.选中checkable后,Button变成切换按钮(toggle button),可以有两种状态:按下/弹 ...
- GRE学习日志
发现开博客园真的很有督促作用,今天也顺便开个GRE学习日志吧 2015-02-09:单词 2015-02-10:单词 2015-02-11:单词 2015-03-02:阅读 2015-03-04:阅读 ...
- 第八章 Qt GUI之对话框使用
第八章 Qt GUI之对话框使用 对话框可以是模态(modal)的或非模态(modeless)两种.当我们在一个用户界面程序里面对一个对话框(比如选择文件对话框)的操作没有结束前,界面的其他窗口无法操 ...
随机推荐
- 访问FLASH设备-W25X16
/************************************* *文件名称:w25x16_spi.c * *功能描述:访问和写入数据到闪存w25x16 * *建立日期:2016-03-1 ...
- java.util 集合框架集合
java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...
- 从决策树学习谈到贝叶斯分类算法、EM、HMM --别人的,拷来看看
从决策树学习谈到贝叶斯分类算法.EM.HMM 引言 最近在面试中,除了基础 & 算法 & 项目之外,经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法(当然,这完全 ...
- adaboost算法
三 Adaboost 算法 AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器.(很多博客里说的三个臭皮匠 ...
- hdu 2030
PS:原本这道题就空了好久...今天才去查了下汉字机内码... 然后才知道了. 1—— 一个汉字在字符串中是以两个负的字符形式存储,所以本题只要把字符串中负字符的个数找出来,再 除以2 就OK了. 2 ...
- 搭建EJB3开发环境
开发工具:myeclipse8.5.antjdk:1.5容器:jboss4.2.31.安装jboss:解压.配置JBOSS_HOME环境变量2.测试安装是否成功:启动%JBOSS_HOME%\bin\ ...
- Osmocom-BB多信道修改代码相关
修改bb\src\target\firmware\layer1\prim_rx_nb.c 文件 这个nb表示normalburst,指的是ccch的数据,用专业的术语,应该是,一个ccch的burst ...
- 什么php?
PHP是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用.PHP的语法借鉴吸收了C语言.Java和Perl等流行计算机语言的特点,易于一般程序员学习.PHP的主要目标是允许网络开 ...
- linux命令:cd
1.介绍: cd可以说是linux下最基本的命令,全称是change directory. 2.命令格式: cd [DIRECTORY] 3.命令功能: 切换到指定目录 4.常用范例: 例一:切换到根 ...
- 【转】阿里2015校招面试回忆(成功拿到offer)
原文转自:http://blog.jobbole.com/78722/ 1. 引言 继上次<百度2015校园招聘面试题回忆(成功拿到offer)>文章过后,大家都希望除了题目之外,最好能给 ...