哈喽大家好,我是20YC小二!欢迎扫码关注公众号,现在可免费领取《C++程序员》在线视频教程哦!
~下面开始今天的分享内容~
1. QWidget介绍
QWidget 是 Qt 框架中的一个核心类,用于创建图形用户界面(GUI)应用程序的基本可视化元素。它是所有窗口组件类的父类,每个窗口组件都是一个 QWidget。QWidget 类对象常用作父组件或顶级组件使用。QWidget 提供了一套完整的窗口系统,包括窗口管理、事件处理、绘图等功能。
QWidget的主要功能和特点包括:
- 窗口管理:QWidget 提供了创建和管理窗口的功能,包括设置窗口的大小、位置、标题等属性,以及处理窗口的显示、隐藏、移动等事件。
- 事件处理:QWidget 支持各种事件处理机制,包括鼠标事件、键盘事件、定时器事件等。开发人员可以通过重写QWidget 的事件处理函数来实现自定义的事件处理逻辑。
- 绘图功能:QWidget 具有强大的绘图功能,可以在窗口上绘制各种形状、图像和文本。通过重写 QWidget 的paintEvent() 函数,开发人员可以自定义绘制逻辑,实现复杂的图形渲染。
- 子控件管理:QWidget 可以作为容器组件使用,包含其他子控件。开发人员可以通过添加子控件来创建复杂的用户界面,并通过布局管理器来控制子控件的位置和大小。
- 信号与槽机制:QWidget 同样支持 Qt 的信号与槽机制,可以定义控件之间的事件传递和处理逻辑。这使得开发人员可以方便地实现控件之间的交互和协作。
QWidget具有窗口管理、事件处理、绘图功能、子控件管理、信号与槽机制等功能。通过合理地使用 QWidget,开发人员可以创建高效且用户友好的图形用户界面,提高应用程序的用户体验。
-
如何使用:
头文件:#include <QWidget>
cmake:find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake:QT += widgets
继承于:QWidget 和 QPaintDevice
2. QWidget 单独显示例子:
#include <QWidget>
QWidget * p_widget = new QWidget();
p_widget->setAttribute(Qt::WA_DeleteOnClose, true);
p_widget->setWindowTitle("20YC编程社区");
p_widget->show();
3. QWidget 常用信号
// 当窗口标题改变时,发射该信号。
void windowTitleChanged(const QString &title)
// 当窗口图标改变时,发射该信号。
void windowIconChanged(const QIcon &icon)
// 当请求弹开自定义右键菜单时,发射该信号。
void customContextMenuRequested(const QPoint &pos)
4. 自定义显示风格例子
QWidget::setStyleSheet() 函数,用于在 Qt 图形用户界面库中设置窗口控件的样式表。它允许你使用类似于 CSS 的语法来改变部件的外观和感觉。
所有 QWidget 控件及其派生类都支持 setStyleSheet() 函数。
以下例子实现设置红色背景,带 2 像素黑色边框,边框圆角。
/**** 例子: ****/
QWidget * p_widget = new QWidget(this);
p_widget->setGeometry(320, 150, 250, 220);
p_widget->setStyleSheet("background-color: rgb(255, 0, 0);border: 2px solid black; border-radius: 10px;");
5. QWidget 常用属性
- winId() 窗口ID:
// 访问函数
WId winId() const
- windowType 窗体类型:
// 访问函数;详细查看 Qt::WindowType 枚举定义
inline Qt::WindowType windowType() const
- parentWidget 父窗体:
// 访问函数
QWidget *parentWidget() const
void setParent(QWidget *parent)
- isModal 是否模态窗体:
窗体一般会有二种显示模式:
- 模态窗体:模态窗体是指在其没有被关闭之前,用户不能与同一个应用程序的其他窗体 进行交互,直到该对话框关闭;模态窗体一般应用在提示用户输入或选择弹出界面。
- 非模态窗体:非模态窗体是指当窗体被打开时,用户还可以与同一个应用程序的其他窗体进行交互;
// 访问函数;默认 false 非模态窗体
bool isModal() const
- isEnabled 是否启用状态:
非启用(禁用)的 QWidget 一般会灰色显示,并且不会处理鼠标、键盘等事件。
// 访问函数;默认 true 启用状态
bool isEnabled() const
void setEnabled(bool enabled)
void setDisabled(bool disabled)
- acceptDrops 是否接受拖放事件:
// 访问函数;默认 false 不接受拖放事件
bool acceptDrops() const
void setAcceptDrops(bool on)
- x,y 坐标和 width, height 大小:
// 访问函数
int x() const // 返回 x
int y() const // 返回 y
QPoint pos() const // 返回 QPoint(x,y)
QSize size() const // 返回 QSize(width,height)
inline int width() const // 返回 width
inline int height() const // 返回 height
inline QRect rect() const // 返回 QRect(x,y,width,height)
const QRect &geometry() const // 返回 QRect(x,y,width,height)
void move(int x, int y) // 移动到指定 x,y
void move(const QPoint &pos) // 移动到指定 QPoint(x,y)
void resize(int w, int h) // 调整大小 weight,height
void resize(const QSize &size) // 调整大小 QSize(weight,height)
// 设置 x,y,weight,height
inline void setGeometry(int x, int y, int w, int h)
// 设置 QRect(x,y,weight,height)
void setGeometry(const QRect &rect)
- font 窗体绘制字体:
// 访问函数;详细查看 QFont 类定义
const QFont &font() const
void setFont(const QFont &font)
- cursor 鼠标光标:
// 访问函数;默认 Qt::ArrowCursor;详细查看 QCursor 类定义
QCursor cursor() const
void setCursor(const QCursor &cursor)
/**** 例子 ****/
p_widget->setCursor(Qt::IBeamCursor);
- windowTitle 窗口标题:
// 访问函数
QString windowTitle() const
void setWindowTitle(const QString &)
/**** 例子 ****/
p_widget->setWindowTitle("20YC编程社区");
- windowIcon 窗口图标:
// 访问函数;详细查看 QIcon 类定义
QIcon windowIcon() const
void setWindowIcon(const QIcon &icon)
/**** 例子 ****/
p_widget->setWindowIcon(QIcon("E:/20YC/logo1.png"));
- focus 焦点:
// 设置焦点
inline void setFocus() { setFocus(Qt::OtherFocusReason); }
// 清除焦点
void clearFocus()
// 设置焦点:详细查看 Qt::FocusReason 枚举定义
void setFocus(Qt::FocusReason reason)
// 是否有当前焦点
bool hasFocus() const
// 返回焦点策略;详细查看 Qt::FocusPolicy 枚举定义
Qt::FocusPolicy focusPolicy() const
// 设置焦点策略
void setFocusPolicy(Qt::FocusPolicy policy)
- visible 窗体可视:
// 设置是否可视
virtual void setVisible(bool visible)
// 设置是否隐藏
void setHidden(bool hidden)
// 显示(可视)
void show()
// 隐藏
void hide()
// 是否可视
bool isVisible() const
// 是否隐藏
inline bool isHidden() const
6. tooltip 工具提示
设置工具提示文本,当鼠标停留在 QWidget 控件区域之上一段时间,自动弹出消息提示框,当鼠标移开自动消失。
所有 QWidget 控件及其派生类,都支持 tooltip 工具提示功能。
// 访问函数;
void setToolTip(const QString &)
QString toolTip() const
void setToolTipDuration(int msec)
int toolTipDuration() const
/**** 例子: ****/
p_widget->setToolTip("红色方框演示");
7. QWidget 界面重绘
- update() 刷新界面:
调用 QWidget::update() 函数不会立即重绘界面,而是把绘制指令放到主消息循环,由主消息循环统一调用绘制窗体
// 重绘整个区域
void update()
// 以下三个函数只重绘指定区域;详细查看 QRect,QRegion 类定义
inline void update(int x, int y, int w, int h)
void update(const QRect &rect)
void update(const QRegion ®ion)
- repain() 重绘界面:
调用 QWidget::repaint() 函数会立即重绘界面
为了避免死循环,需要避免在 paintEvent 调用 repaint() 函数
// 重绘整个区域
void repaint()
// 以下三个函数只重绘指定区域;详细查看 QRect,QRegion 类定义
void repaint(int x, int y, int w, int h)
void repaint(const QRect &rect)
void repaint(const QRegion ®ion)
8. QWidget 窗口控制
// 窗口最小化
void showMinimized()
// 窗口最大化
void showMaximized()
// 全屏显示
void showFullScreen()
// 正常显示
void showNormal()
// 是否最小化
bool isMinimized() const
// 是否最大化
bool isMaximized() const
// 是否全屏显示
bool isFullScreen() const
// 关闭窗口
bool close()
9. QWidget 常用虚函数
派生类重写父类虚函数,可以捕捉父类指定事件。
// 【鼠标按下】事件处理函数
virtual void mousePressEvent(QMouseEvent *event)
// 【鼠标释放】事件处理函数
virtual void mouseReleaseEvent(QMouseEvent *event)
// 【鼠标双击】事件处理函数
virtual void mouseDoubleClickEvent(QMouseEvent *event)
// 【鼠标移动】事件处理函数
virtual void mouseMoveEvent(QMouseEvent *event)
// 【鼠标滚轮】事件处理函数
virtual void wheelEvent(QWheelEvent *event)
// 【键盘按键按下】事件处理函数
virtual void keyPressEvent(QKeyEvent *event)
// 【键盘按键释放】事件处理函数
virtual void keyReleaseEvent(QKeyEvent *event)
// 【窗体重绘】事件处理函数
virtual void paintEvent(QPaintEvent *event)
// 【窗体移动】事件处理函数
virtual void moveEvent(QMoveEvent *event)
// 【窗体尺寸改变】事件处理函数
virtual void resizeEvent(QResizeEvent *event)
// 【窗体关闭】事件处理函数
virtual void closeEvent(QCloseEvent *event)
// 【鼠标右键菜单】事件处理函数
virtual void contextMenuEvent(QContextMenuEvent *event)
// 【窗体显示】事件处理函数
virtual void showEvent(QShowEvent *event)
// 【窗体隐藏】事件处理函数
virtual void hideEvent(QHideEvent *event)
10. QWidget 各种风格显示例子
功能:创建各种显示风格的 QWidget 控件,如设置 QWidget 背景颜色、边框、圆角边框等。
-
.h 头文件源码:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
};
#endif // WIDGET_H
-
.cpp 源文件源码:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->setWindowTitle("20YC编程社区");
// 设置蓝色背景;
QWidget * p_widget1 = new QWidget(this);
p_widget1->setGeometry(20, 20, 200, 100);
p_widget1->setStyleSheet("background-color: blue;");
// 设置带透明度的蓝色背景;
// rgba(0, 0, 255, 125):rgb分别表示红色 绿色 蓝色的值;a表示透明度;取值范围:0 - 255
QWidget * p_widget2 = new QWidget(this);
p_widget2->setGeometry(250, 20, 300, 100);
p_widget2->setStyleSheet("background-color: rgba(0, 0, 255, 125);");
// 设置绿色背景,带 2 像素黑色边框
QWidget * p_widget3 = new QWidget(this);
p_widget3->setGeometry(20, 150, 250, 220);
p_widget3->setStyleSheet("background-color: rgb(0, 255, 0);border: 2px solid black;");
// 设置红色背景,带 2 像素黑色边框,边框圆角
QWidget * p_widget4 = new QWidget(this);
p_widget4->setStyleSheet("QWidget {background-color: rgb(255, 0, 0);border: 2px solid black; border-radius: 10px;}");
p_widget4->setToolTip("红色方框演示");
}
Widget::~Widget()
{
}