QWidget
QWidget是容器组件,继承自QObject类和QPaintDevice类。能够绘制自己和处理用户输入,是QT中所有窗口组件类的父类,是所有窗口组件的抽象,每个窗口组件都是一个QWidget,QWidget类对象常用作父组件或顶级组件使用
QWidget常用方法:
构造函数:
- QWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);
- parent 指向父窗口,如果这个参数为 0,则窗口就成为一个顶级窗口
-
参数 f 是构造窗口的标志,主要用于控制窗口的类型和外观等
依赖关系
- QWidget *window() const; // 所得所在的独立窗口 ,当然,如果窗口本身就是独立窗口,那么得到的就是自己。
- QWidget *parentWidget() const; // 得到父窗口
窗口标题
- QString windowTitle() const; // 获得窗口标题
- void setWindowTitle(const QString &text); // 设置窗口标题为 text
几何参数
几何参数指的是窗口的大小和位置。一个窗口有两套几何参数,一套是窗口外边框所占的矩形区域,另一套是窗口客户区所占的矩形区域。所谓窗口客户区就是窗口中去除边框和标题栏用来显示内容的区域。
客户区几何参数变化之后,外边框的几何参数也会随之变化。设置几何参数可能会使窗口的位置及大小发生变化,这时会发送窗口移动事件 QMoveEvent,如果大小有变化,还会发送窗口改变大小事件 QResizeEvent, 这里的坐标都是相对于父窗口的,因此移动一个窗口并不导致它的所有部件都接收到移动事件。
- const QRect &geometry() const; // 获取客户区几何参数
- void setGeometry(int x, int y, int w, int h); // 设置客户取几何参数
- void setGeometry(const QRect &rect); // 设置客户区几何参数
- QRect frameGeometry() const; // 获取外边框几何参数
- QSize frameSize() const; // 窗口大小 (外边框几何参数)
- QPoint pos() const; // 获得窗口左上角的坐标(外边框几何参数)
- QSize size() const; // 窗口大小 (客户区几何参数)
- int x() const; // 窗口左上角横坐标 (外边框几何参数)
- int y() const; // 窗口左上角纵坐标 (外边框几何参数)
- int height() const; // 窗口高度 (客户区几何参数)
- int width() const; // 窗口宽度 (客户区几何参数)
- void move(int x, int y); // 将窗口左上角移动到坐标(x, y)处;
- void move(const QPoint &pos); // 将窗口左上角移动到 pos 处;
- void resize(int w, int h); // 将窗口的宽度改为 w, 高度改为 h
- void resize(const QSize &size); // 将窗口的大小改为 size
- bool isMinimized() const; // 判断窗口是否为最小化
- bool isMaximized() const; // 判断窗口是否为最大化
- bool isFullScreen() const; // 判断窗口是否为全屏
- void showMinimized(); // 以最小化方式显示窗口,这是一个槽
- void showMaximized(); // 以最大化方式显示窗口,这是一个槽
- void showFullScreen(); // 以全屏方式显示窗口,这是一个槽
- void showNormal(); // 以正常方式显示窗口,这是一个槽
- Qt::WindowStates windowState() const; // 获取窗口状态
- void setWindowState(Qt::WindowStates windowState); // 设置窗口状态
Qt::WindowStates 类型有以下几个取值。取值可以用 “按位或” 的方式组合起来使用。1)Qt::WindowNoState:无标志,正常状态。2)Qt::WindowMinimized:最小化状态。3)Qt::WindowMaxmized:最大化状态。4)Qt::WindowFullScreen:全屏状态。5)Qt::WindowActive:激活状态。
需要注意的是,调用 setWindowState 函数将使窗口变为隐藏状态。
字体
font 属性表示所用的字体, 如果没有为窗口设置字体,则窗口自动使用父窗口的字体,顶级窗口则使用应用程序的默认字体。
-
const QFont &font() const; // 获得字体
-
void setFont(const QFont &); // 设置字体
布局
layout 代表窗口的顶级布局
-
QLayout *layout() const; // 获得顶级布局
-
void setLayout(QLayout *layout); // 设置顶级布局
窗口可见性
可见性指的是窗口是否显示在屏幕上的属性。被其他窗口暂时遮挡住的窗口也属于可见的。可见性由窗口的 visible 属性表示
- bool isVisible() const; // 判断窗口是否可见
- bool isHidden() const; // 判断窗口是否隐藏
- virtual void setVisible(bool visible); // 设置窗口是否隐藏 这是一个槽
- void setHidden(bool hidden); // 等价于 setvisible(!hidedn); 这是一个槽
- void show(); // 显示窗口,等价于 setVisible(true); 这是一个槽
- void hide(); // 隐藏窗口,等价于 setHidden(true); 这是一个槽
当窗口显示时,将发送 QShowEvent 事件;当窗口隐藏时,将发送 QHideEvent 事件。事件的处理函数分别是 showEvent 和 hideEvent。
激活状态
当有多个独立窗口同时存在时,只有一个窗口能够处于激活状态。系统产生的键盘、鼠标等输入事件将被发送给处于激活状态的窗口。一般来说,这样的窗口会被提升到堆叠层次的最上面,除非其他窗口有总在最上面的属性
-
bool isActiveWindow() const; // 判断窗口所在的独立窗口是否激活
-
void activateWindow(); // 设置窗口所在的独立窗口为激活状态
注意:这里操作的其实不是窗口本身,而是窗口所在的独立窗口,因为窗口部件时没有激活状态的概念的。
焦点
焦点用来控制同一个独立窗口内哪一个部件可以接受键盘事件,同一时刻只能有一个部件获得焦点。窗口部件得到焦点以后,还需要它所在的独立窗口处于激活状态才能得到键盘事件。
一个窗口获得焦点,同时意味着另一个窗口失去焦点。当窗口获得或失去焦点时,将发送 QFocusEvent 事件,它有两个处理函数:forceInEvent 和 focusOutEvent,分别对应获得焦点和失去焦点。
值得一提的是 editFocus 属性,这是一个专门用于嵌入式系统的属性。因为嵌入式系统通常键盘较小,没有专门用于切换焦点的 Tab 键,所以上下方向键被用来切换焦点。如果一个窗口部件设置 editFocus 属性为 true,则上下方向键就不再用于切换焦点,而是发送给这个窗口。
- bool hasFocus() const; // 判断窗口是否获得焦点
- void setFocus(); // 使窗口获得焦点,这是一个槽
- void clearFocus(); // 使窗口失去焦点
- QWidget *focusWidget() const; // 得到窗口内获得焦点的子窗口
- bool hasEditfocus() const; // 判断窗口是否有 editFocus 属性
- void QWidget::setEditFocus(bool enable); // 设置窗口的 editFocus 属性
信号
-
void destoryed(QObject *obj = 0); //这是一个从 QOjbect 类继承过来的信号。QObject 对象析构时,先发射这个信号,然后才析构它的所有子对象。
槽
- bool close(); //当这个槽被调用时,首先向这个窗口发送一个关闭事件,如果事件被接受,则窗口隐藏,如果被拒绝,则什么也不做。如果窗口设置了 Qt::WA_QuitOnClose 属性,则窗口对象会被析构,大多数类型的窗口都默认设置了这个属性。这个槽的返回值表示关闭事件是否被接受,也就是窗口是否真的被关闭了。
- void lower(); // 降低窗口到最下面
- void raise(); // 提升窗口到最上面
捕获键盘和鼠标事件
捕获了键盘鼠标事件的窗口将得到所有键盘鼠标事件,而其他窗口将完全得到不到键盘鼠标事件,直到捕获了键盘鼠标事件的窗口释放键盘鼠标事件。 窗口部件即使获得焦点,也不一定能获得按键事件,因为其他窗口可能会捕获键盘事件。
键盘事件和鼠标事件的捕获是相互独立的。这里要注意两点:一是如果有另外一个窗口进行了捕获操作,则当前处于捕获状态的窗口将失去对事件的捕获;二是只有可见的窗口才能进行输入事件捕获。
-
void grabKeyboard(); // 捕获键盘事件
-
void releaseKeyboard(); // 释放键盘事件
-
void grabMouse(); // 捕获鼠标事件
-
void releaseMouse(); // 释放鼠标事件
-
QWidget *keyboardGrabber(); // 得到正在捕获键盘事件的窗口
-
QWidget *mouseGrabber(); // 得到正在捕获鼠标事件的窗口
事件
事件处理函数都没有返回值,因此如果要接受或拒绝和一个事件要调用 QEvent 类的成员函数
-
event->accept(); // 接受事件
-
event->ignore(); // 拒绝事件
事件被拒绝后的结果视具体情况而定,比如关闭事件被拒绝后,窗口将不会被关闭,而键盘、鼠标等输入事件被拒绝后会向上传播到父窗口。
- virtual void closeEvent(QCloseEvent *event); // 关闭
- virtual void showEvent(QShowEvent *event); // 显示
- virtual void hideEvent(QHideEvent *event); // 隐藏
- virtual void moveEvent(QMoveEvent *evnet); // 移动
QMoveEvent 类的成员函数可以获得窗口的旧坐标和新坐标const QPoint &oldPos() const // 旧坐标const QPoint &newPos() const // 新坐标
- virtual void resizeEvent(QResizeEvent *event); // 改变大小
- virtual void keyPressEvent(QKeyEvent *event); // 键按下
- virtual void keyReleaseEvent(QKeyEvent *event); // 键松开
- virtual void KeyReleaseEvent(QKeyEvent *event); //键盘离开事件
QKeyEvent: 成员函数可以获得关于按键的一些信息int key() const; // 得到键的枚举值
- virtual void mousePressEvent(QMouseEvent *event); // 鼠标键按下
- virtual void mouseReleaseEvent(QMouseEvent *event); // 鼠标键松开
- virtual void mouseDoubleCllckEvent(QMouseEvent *event); // 鼠标键双击
- virtual void mouseMoveEvent(QMouseEvent *event); // 鼠标移动 //TODO QMouseEvent
- virtual void enterEvent(QEvent *event); // 鼠标进入窗口
- virtual void leaveEvent(QEvent *event); // 鼠标离开窗口
- virtual void wheelEvent(QWheelEvent *event); // 鼠标滚轮移动
QMouseEvent 事件的成员函数可获得关于鼠标的信息const QPoint &pos() const; // 得到鼠标坐标(相对于接收事件的窗口) int x() const; // 得到鼠标横坐标(相对于接收事件的窗口) int y() const; // 得到鼠标纵坐标(相对于接收事件的窗口) const QPoint &globalPos() const; // 得到鼠标坐标(全局坐标) int globalX() const; // 得到鼠标横坐标 (全局坐标) int globalY() const; // 得到鼠标纵坐标 (全局坐标) Qt::MouseButton button() const; // 得到引起事件的鼠标键 Qt::MouseButtons buttons() const; //得到事件发生时的鼠标键状态 其中,Qt::MouseButton 是一个枚举类型,有以下常用取值。1)Qt::NoButton:无键。2)Qt::LeftButton:左键。3)Qt::RightButton:右键。4)Qt::MidButton:中键。对于鼠标移动事件 QMouseEvent 和 button 函数总是返回 Qt::NoButton,buttons 函数返回值则是 Qt::MouseButton 类型的 “按位或” 组合,它能反映事件发生时鼠标键的按下状态。QWheelEvent 类代表滚轮事件,它有一套与 QMountEvent 类几乎相同的成员函数,但少一个 button 函数,多以下两个函数:int delta() const; // 获得滚轮转动的角度 Qt::Orientation orientationI() const; // 获得滚轮转动的方向 其中 Qt::Orientation 是一个枚举类型,它有以下取值。1)Qt::Horizontal:横向。2)Qt::Vertical:纵向。
-
virtual void focusInEvent(QFocusEvent *event); // 获得焦点
-
virtual void focusOutEvent(QFocusEvent *event); // 时取焦点