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"