资讯动态

QT基础学习

发布时间:2026/10/13 3:11:53 来源:尧图企业网站定制
环境配置网址https://www.qt.io/development/download-qt-installer-oss 下载安装包下载在cmd终端“C:\Users\Lenovo\AppData\Local\qt-online-installer-windows-x64-4.11.0.exe” --mirror https://mirrors.aliyun.com/qt后续选择 Qt Creator 20.0.0Qt 6.8.3里的MinGW 13.1.0 64-bit以及sourcesAdditional里的Charts、Graphs、HTTP Servers、TP、Multimediatools里的 CMake、Ninja 1.12.1Qt是一个跨平台的C应用程序开发框架基类组件主窗口 、普通窗口(自定义窗口)、对话框修改CMakecmake_minimum_required(VERSION3.19)project(HiQt LANGUAGES CXX)find_package(Qt66.5REQUIRED COMPONENTS Core Widgets)qt_standard_project_setup()qt_add_executable(HiQt main.cpp widget.cpp widget.h)target_link_libraries(HiQt PRIVATE Qt6::Core Qt6::Widgets)include(GNUInstallDirs)install(TARGETS HiQt BUNDLE DESTINATION.LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})修改完后需要 运行一下CMake基础知识带参数的主函数窗口及信息窗口按钮类必须创建Qt应用程序主进程 QApplication a(argc, argv);必须return a.exec();//最后运行程序监控子进程的事件或消息并调度点击退出操作 以及 确认退出对话框Day 2:布局与基础控件1. 窗口类的基类QMainWindowQWdigetQDialog1.Qt常见的组件/控件QPushButton(按钮)、QToolButton(工具按钮)、QLabel(标签)QComboBox(下拉框)、QSpinBox、QCheckBox、QRadioButton、QSlider(滑动块)、QProgressBar(进度条)2. 布局管理器setGeometry绝对定位窗口拉大 控件大小不变#includewidget.h#includeQpushButton#includeQLabelWidget::Widget(QWidget*parent):QWidget(parent){//设置当前窗口信息大小 标题 外框(Flags)setMinimumSize(480,300);//最小大小//添加子控件在当前窗口创建子控件//this当前窗口地址 创建控件对象时指定parent为this 表示在此窗口显示QPushButton*btn1newQPushButton(this);btn1-setText(OK);btn1-setGeometry(40,50,40,50);//(x,y,width,height)QPushButton*btn2newQPushButton(this);btn2-setText(NO);btn2-setGeometry(120,50,60,50);//setGeometry绝对定位窗口拉大 控件大小不变//下拉框QComboBox*jobsnewQComboBox(this);jobs-setGeometry(240,50,200,50);jobs-addItems({C应用开发工程师,Linux开发工程师,后端开发工程师,Qt开发工程师});}Widget::~Widget()default;QLayout布局管理器自动计算控件的位置和大小窗口变化时重新布局Qt常用的布局4个类配合布局使用时 有弹性空间QSpacerItem弹簧占位项登录界面的设计(form布局)#ifndefLOGINWIDGET_H#defineLOGINWIDGET_H#includeQWidget#includeQLabel#includeQPushButton#includeQLineEdit//单行输入框#includeQFormLayout#includeQHBoxLayout#includeQVBoxLayout#includeQSpacerItemclassLoginWidget:publicQWidget{Q_OBJECTpublic:explicitLoginWidget(QWidget*parentnullptr);signals:};#endif// LOGINWIDGET_H窗口函数#includeloginwidget.hLoginWidget::LoginWidget(QWidget*parent):QWidget{parent}{QVBoxLayout*mainlayoutnewQVBoxLayout(this);QFormLayout*layoutnewQFormLayout();//设置窗口标题和大小setWindowTitle(登录窗口);setFixedSize(400,280);//创建控件QHBoxLayout*line1newQHBoxLayout();//第一行line1-addWidget(newQLabel(账户));line1-addWidget(newQLineEdit());//单行输入框layout-addRow(line1);QHBoxLayout*line2newQHBoxLayout();line2-addWidget(newQLabel(密码));QLineEdit*pwdEditnewQLineEdit();pwdEdit-setEchoMode(QLineEdit::PasswordEchoOnEdit);//单个控件设置样式pwdEdit-setStyleSheet(color:blue;);line2-addWidget(pwdEdit);layout-addRow(line2);QHBoxLayout*line3newQHBoxLayout();QSpacerItem*space1newQSpacerItem(200,50);//QSpacerItem弹簧占位项宽度 200高度 50 的空白占位块作用把登录按钮挤向右边line3-addItem(space1);//layout-addWidget(new QLabel());QPushButton*loginbtnnewQPushButton(登录);line3-addWidget(loginbtn);layout-addRow(line3);//定义多行文本QString qssR( *{ font-size:14px;/*设置所有字体大小*/ } QWidget{ /*background-color:#ccccdd;背景色*/ } QLineEdit{ font-size:14px;/*字体大小*/ padding:5px;/*文本和边框的距离 内边距*/ margin:5px;/*外边距*/ border:1px solid lightgray;/*亮灰色框*/ border-radius:10px;/*圆角*/ } QLineEdit:focus{ border:1px solid red;/*选中时变成红色框*/ } QPushButton{ padding:20px 30px;/*按钮大小*/ background-color:skyblue;/*按钮背景颜色*/ border: none; /*去掉系统默认边框:加上后 鼠标的悬浮和按下才生效*/ color:white; } QPushButton:hover{/*鼠标悬浮在上时*/ background-color:blue; } QPushButton:pressed{/*鼠标按下时*/ background-color:darkblue;/*按钮背景颜色*/ } QLabel{ color:pink; } );mainlayout-setAlignment(Qt::AlignCenter);//让布局里面的所有子控件整体在布局的可用区域内居中mainlayout-addLayout(layout);setStyleSheet(qss);//当前窗口的样式 非全局窗口}主函数#includeloginwidget.h#includeQApplicationintmain(intargc,char*argv[]){QApplicationa(argc,argv);a.setStyleSheet(QPushButton{padding:20px 30px;background-color:skyblue;border:none;}QPushButton:hover{background-color:#45a049;}QPushButton:pressed{background-color:#3d8b40;});//全局窗口样式:窗口函数未自定义样式时 全局才管用LoginWidget w;//自定义窗口类的对象w.show();returnQApplication::exec();}效果Day3信号与槽1. 信号与槽函数以及为什么使用内部出现信号时 槽函数就可以处理信号是指“发生了什么事件” 槽是“如何响应”两者通过QObejct::connect 连接 发送信号时槽函数被调用信号槽机制可以用于线程与UI界面进行交互为什么使用解耦发送者不关心谁接收 接收者不会关心谁发送类型安全参数类型不匹配时编译报错灵活一个信号可以连接多个槽 多个信号可以连接一个槽2.五种连接方式widget.hwidget.cpp除了以上五种模式外 还有一种自动连接信号与槽的方式主要存在UI界面时UI界面上的对象和信号按特定的格式生成一个槽函数即自动连接。如UI界面的按钮的btn1关联槽函数点击3.自定义信号Day4事件系统回顾disconnect和sender通过connect连接的信号和槽 可以通过disconnect解绑如果和connect参数一样 是对特定绑定进行解绑 如果参数均为nullptr 是对第一个参数(控件)的所有槽函数解绑sender获取信号发送者(多个信号连接同一个槽函数时获取发送信号的对象)qobject_cast目标类型(对象) QT的类型转换 类似于C的dynamic_cast动态转换但不需要依赖RTTI信号只需要声明 不需要实现信号和槽函数参数类型必须一致 或槽函数少于信号lambda表达式不能访问已销毁的对象信号的返回值是void 槽函数有返回值但通常会被忽略1. 什么是事件 与信号的区别事件可以变现成信号 信号是某些事件组合的表现2.事件的处理流程what从操作系统产生事件到最终被Qt应用处理完成的完整路径why理解事件流转机制才能在正确的环节拦截或处理事件how全局事件过滤器 可以捕获所有对象的事件对象级别过滤器会提前操作关键方法你的日志服务系统在什么地方使用 怎么使用应用程序给QT开发人员提供第三方库 让他使用3.常见事件重写自定义Qt的应用程序类重写QApplication的notify()函数做全局事件拦截 / 监听**可以在事件分发给控件之前先捕获整个程序所有的 Qt 事件。**Qt 所有事件鼠标点击、按键、重绘、关闭、移动窗口……都会先走QApplication::notify再派发给对应控件。UI 里放一个按钮setObjectName(btn1)鼠标移上去、点击、松开控制台就会不断打印 receiver 和事件类型其他按钮、输入框操作不会打印任何东西。event事件分发窗口获得焦点按数字label 显示数字按 Clabel 清空点右上角关闭弹出确认框选 Yes 关闭No 就不关闭如果把event()里代码打开就会在 event 层直接处理按键keyPressEvent不会执行。被注释的代码①把按键事件转发给别的控件②在event()层直接处理按键不再往下走到keyPressEvent。Day5事件过滤器及QPainter绘图1.事件过滤器在事件到达目标对象之前 先被另一个对象拦截处理安装事件过滤器ui-ageEdit-installEventFilter(this);事件拦截过程2.sendEvent()和postEvent()what手动发送事件的两种方式 – 同步直送 / 异步入队why在特定场景需要程序性的触发事件(如模拟用户操作、子线程通知主线程)howsendEvent()同步发送postEvent()异步发送内部自定义事件两个线程之间3.QPainter绘图QPainter是2D的绘图引擎用于绘制点线矩形圆形文字图片等原因标准控件无法满足所有界面需求自定义控件需要自绘(仪表盘图标画板自定义进度条)绘图三要素QPainter画笔QPaintDevice画布QWidgetQPixmapQImage等QPaintEngine引擎。QPainter基础绘图在控件中 重写画图事件自定义按钮(绘图)将自定义控件加入到别的窗口Day6QPainter绘图1.画点满屏画 固定位置点随机位置50个点2.画线3.画圆4.画文本5.画图片显示图片画图片从资源管理器选择图片6.面试练习题添加新文件 ui/h MainWidget先设置布局总窗口是垂直布局 上面添加一个水平布局 下面添加widget窗口 然后在上面的水平布局内添加一个水平布局填充 、一个label、两个选择框在总窗口的垂直布局下添加一个垂直弹簧添加新文件新类DrawWidget然后将ui界面的QWidget窗口提升为UI 设计师拖出来的控件默认是原生类比如QWidget。**提升为**就是告诉 Qt这个 UI 上的控件**不要用原生 QWidget 实例改用你自己写的子类DrawWidget**。Day7QPainter绘图1. 画布补充画板控件新建的Qt控件主窗口颜色展示标签新建一个类2.主窗口设计设计图标的引用创建icons文件夹 保存一些.png图标 放入到本项目中要显示图标 需要新建一个文件添加前缀添加文件在ui界面 选择对象icons的正常关内设置图标在main函数中设置主窗口的图标shoutcut可添加快捷键3. 文件操作mainwindow.cpp:Day8图标的显示Qt6之CMake模式下 默认是关闭OFF状态(不便宜QRC文件到exe‘二进制文件’文件中) 必须手动开启RCC资源编译器set(CMAKE_AUTORCC ON)设置宏的状态1.在状态栏显示图标位置状态栏文本不消失(showMessage有超时时间 默认0)给设置选项添加新窗口添加新文件 OpationWidgetui/hui设置为在头文件添加创口并在cpp文件新疆窗口并显示到设置选项中(替换原来窗口)在构造函数中字体大小与字体的设计(有默认值)颜色以及确定按钮的设计状态栏的最终设计

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑