Qt编程 (一)

2023-11-11

一、Qt简介

    1、Qt是什么
    图形用户程序框架,是对底层应用编程接口API面向对象的封装
    是一套基于C++语言的类库,专注但不局限于图形用户界面的开发,也可以进行系统调用、网络编程、数据库、2D/3D图形处理
    特点:跨平台,支持Linux,Windows、MacOS、iOS、Android等操作系统
    2、为什么选择Qt
    基于C++语言,简单、易用、面向对象(针对GTK)
    优良的跨平台特性(针对MFC),工控、嵌入式

二、Qt环境与编译工具

    1、工具
    Qt助手:Qt参考文档,涉及了Qt中的每一个类和函数,是Qt开发的必备手册,在终端可以通过assistant命令启动
    Qt构建器:它负责对源文件、头文件、界面文件进行解析生成编译脚本
        qmake -project 根据当前目录里的文件,生成项目配置文件 xxx.pro
        qmake 根据xxx.pro文件生成Makefile 脚本 
    Qt设计师:对于带界面应用程序来说,最纯粹的方式是通过C/C++代码来编写整个项目,但这种方式费时又费力,所以我们一般不这样做界面,而采用一种画图的方式,自动生成对应的代码,所见即所得
    Qt界面编译师:它负责把Qt设计师设计出的界面文件编译成C++代码
        uic xxx.ui -o xxx.h 把界面文件编译成C++类
    Qt创造器:Qt助手+Qt构建器+Qt设计师+Qt界面编译师+文本编辑器就等于Qt创建器,集成开发环境

    2、头文件和库
    Qt安装好之后会在安装目录下创建一个/usr/include/qt4 目录,我们所使用的头文件都在这个目录下
    共享库安装在/usr/lib/i386-linux-gnu/qt4 和 /usr/lib/qt4 目录下
    静态库需要重新下载源文件手动编译

三、第一个Qt程序

    1、Hello Qt
    编译源代码
    生成项目文件:qmake -project    ->hello.pro
    生成编译脚本:qmake                 ->Makefile
    编译:make
    运行:./hello

#include <QApplication>
#include <QTextCodec>
#include <QLabel>

int main(int argc,char* argv[])
{
	// 创建一个字符编码对象
	QTextCodec* codec = QTextCodec::codecForName("utf-8");
	// 告诉Qt外部编码是utf-8
	QTextCodec::setCodecForTr(codec);
	QTextCodec::setCodecForLocale(codec);
	QTextCodec::setCodecForCStrings(codec);

	// 创建一个App对象,它负责管理整个应用程序的资源,同时接收命令参数
	QApplication app(argc,argv);

	// 创建一个显示 "Hello Qt" 的控件
    QLabel lab("你好 Qt");

	// 显示控制
	lab.show();
    emit
	return app.exec();
}

    2、帮助手册
    Public Types:访问权限是public的成员
    Properties:访问权限是 private 这一类的成员都是get/set函数
    Public Functions:访问权限是 public 的成员函数
    Public Slots:访问权限是 public 的槽函数,它可以像成员函数一样使用,但它可以与信号连接(与signal函数绑定一个信号与函数一样),区别是Qt的信号可以自定义
    Signals:信号,注意:不是函数,通过emit发送,会自动执行与它连接的槽函数
    Static Public Members:静态公有成员函数,这类函数与对象无关,管理的对象的公共资源
    Protected Functions:访问权限是protected 的成员函数
    Macros:与本类相关的宏定义
    Detailed Description:对本类的详细说明,使用方法,调用的上下文注意事项,有些类会使用dome

四、中文处理

    注意:在Qt4.8中默认不支持 utf-8 字符编码,因此使用中文时会出现乱码
    内部编码和外部编码:
    Qt的应用程序的控件内部所使用的都是utf-16,这叫做应用程序的内部编码,而我们通过终端,控制输入的字符叫外部编码
    
/*******************************字符编码************************************************/
    QTextCodec* codec=QTextCodec::codecForName("utf-8");
    //告诉Qt本地系统的字符编码
    QTextCodec::setCodecForLocale(codec);

    //告诉Qt程序中所使用的字符串的字符编码
   QTextCodec::setCodecForCStrings(codec);
    
    //告诉Qt外部的字符编码
    QTextCodec::setCodecForTr(codec);
/*************************************************************************************/

五、信号和槽

    1、信号
    当用户或系统触发一个动作,导致某个窗口发生变化,该控件就会发射一个信号,信号就可以调用一个函数,必须时还可以附加参数
    如:QPushButton 控件中就有 clicked(void) 信号
    2、槽
    槽就是一个普通的类成员函数,它可以是公有的、私有的、保护的,可以被重载,也可以被覆盖,其参数、返回值可以是任意类型,可以被直接调用
    与普通函数的区别就是它可以被信号触发,自动执行
    如:窗口控件Qwidget中默认就有 close (void)  槽函数

    3、信号和槽的连接
    注意:QObject是Qt中所有类的父类
    bool QObject::connect(
    const QObject * sender,    //信号发送者
    const char* signal,        //信号签名字符串
    const QObject * receiver,    //信号的接收者
    const char * method);    //槽函数签名字符串

    SIGNAL( ) 将信号函数签名转换成字符串
    SLOT( ) 将槽函数签名转换成字符串

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QObject>

int main(int argc,char* argv[])
{
	QApplication app(argc,argv);
	
	QWidget w;
	w.resize(400,400);
	w.show();

	QPushButton btn("exit");  //新建按钮,取名:exit
	btn.show();

	QObject::connect(&btn,SIGNAL(clicked(void)),&w,SLOT(close(void)));
	QObject::connect(&btn,SIGNAL(clicked(void)),&btn,SLOT(close(void)));

	return app.exec();
}

六、窗口容器

 一个控件就是一个窗口,要想把所有控件集合在同一个窗口中,那么就需要把这些控件束缚在同一个容器中,这种容器就叫窗口容器
    1、QMainWindow
    主窗口容器,通常由标题栏、菜单栏、工具条、状态栏以及中央显示区组成
    2、QDialog
    对话框窗口容器,管理多个不同的交互式控件
    3、QWidget
    纯粹的窗口容器,它是QMainWindow和QDialog的父类

    常用的设置有:
    resize(w,h) 设置窗口的大小
    move(x,y) 设置窗口的位置

    创建控件时把容器对象的地址给控件,就可以把控件放入到容器中

七、Qt创造器的使用

    1、打开Qt创造器
    在终端执行:qtcreator,右键锁定到启动器
    2、创建项目
    文件->新建文件或工程->Qt控件项目->Qt GUI应用->填写项目名称(不要使用中文)->桌面->选择窗口容器->设置类名、头文件名、源文件名->选择是否创建界面文件(设置界面文件名)
    3、窗口类的构成
    
    mainwindow.ui 文件会自动生成 ui_mainwindow.h(在Qt创造器中不可见)
    ui_mainwindow.h 头文件中会自动生成 Ui_MainWindow类,该类中会包含所有mainwindow.ui文件中所画的控件
    在ui_mainwindow.h头文件中会在Ui名字空间中自动创建MainWindow类,Ui_MainWindow会被MainWindow类继承
    mainwindow.h头文件中会自动创建MainWindow类,默认继承QMainWindow,会有一个默认成员Ui::MainWindow *ui,它里面有界面文件中所有的控件

八、Qt常用控件

QLabel:标签控件,用来显示简单的文本,在界面上只读的
        setText 设置显示内容
        text 获取标签上的字符串,返回值是QString
    QPushButton:按钮控件
        同样具有setText、text 
        重要的功能是 单击信号 clicked(),也有双击、悬停、按下、弹起信号。
    QRadioButton:单选按键,同窗口下只能有一个被选中
        重要功能是选中和取消选中信号
    QLineEdit:单行输入文本框
        常用操作是获取它的输入内容
    QTextEdit:多行输入文本框
        常用于输入大段文件,输入的内容可以换行,自带滚动条。
    QComboBox:下拉输入框
        它输入的内容只能通过下接按键选择,只防止用户输入错误常用解决方法。
    QTextBrower:多行文本显示,支持富文本显示。
        在界面上是只读的,文字可以设置字号,字体,颜色,加粗,对齐等操作。
    QGroupBox:分组框,可以放入一个控制统一管理。
        最常用的是放入QRadioButton按钮,一组的按钮只能有一个被选中。
    QxxxSilder:滑块
        有水平、垂直滑块,也可以当进行条使用。
    QSpinBox:数字滑块
        与Silder的用法基本一致,只它是以数字显示。
        Silder的SpinBox主要操作是:初值、最大值、进步值
        即可以用来显示,也可以用来设置。

    
九、Qt创造器常用快捷键及操作

快捷键:
        Alt+0:显示/隐藏侧边栏
        Ctrl+e 松开后按0:删除所有的分割窗口
        Ctrl+e 松开后按1:删除当的分割窗口
        Ctrl+e 松开后安2:水平分割窗口
        Ctrl+e 松开后安3:垂直分割窗口
        Ctrl+B+S:保存所有文件并编译执行
        Ctrl+B:编译执行
        Ctrl+R:运行项目
        Ctrl+/:注释/取消注释
        Ctrl+I:自动缩进选中的代码
        Ctrl+Shift+R:批量修改变量名
        Ctrl+F:搜索、替换
        Ctrl+单击:跳转到定义位置
        Shift+F2:声明与定义之间进行切换
        Alt+Shift+u:小写转换成大写
        Alt+u:大写转换成小写
        F1:光标定位类或对象上,打开对类的帮助手册
        F4:头文件与源文件之间快速切换

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt编程 (一) 的相关文章

  • 如何删除在设计器模式下创建的插槽?

    我已经创建了按钮cancelButton 然后我创建了函数槽on cancelButton clicked 使用上下文菜单项Go to slot 但是 过了一段时间 我删除了这个按钮 不再需要 并尝试删除该函数 但编译器给出错误undefi
  • 无法隐藏 QMenu 对象 QMenu::setVisible()?

    我已经建立了一个QMenu MainMenu在我的上面MainWindow在我的应用程序中 大家都习惯了 我有以下QMenu主菜单 文件 编辑 SuperHeavyExpertMenus 设置 帮助 我想隐藏子树SuperHeaverExp
  • 无法初始化静态QList?

    我收到以下错误 Cube cpp 10 error expected initializer before lt lt token 以下是头文件的重要部分 ifndef CUBE H define CUBE H include
  • 如何在点击 Qtablewidget 单元格时获取放置在该单元格中的小部件的行号?

    我正在尝试的是当用户选择项目时获取 QcomboBox 的行号 虽然使用它很容易获得单元格的列和行 cellClicked int int 信号 但仅当单元格上没有小部件时才有效 那么如果单元格中放置了小部件 如何获取行号 Note 所有组
  • 如何管理返回到 QML 的动态分配的 QObject 的生命周期?

    我有这个代码 QVariant componentFromCode QString code QQmlComponent component new QQmlComponent engine engine gt setObjectOwner
  • 如何使用 Qt Test 控制 QFileDialog?

    我有两个问题 我怎样才能访问QFileDialog并使用 Qt Test 模块在 文件名 字段中写入文件的路径 我这么问是因为我正在 Qt 中开发一些 GUI 测试 现在我需要打开一个文本文件 以下代码创建QFileDialog并获取文件路
  • 删除 QComboBox“下拉”动画

    我正在使用 Qt 4 8 并且想在单击 QComboBox 时摆脱 下拉 动画 我也想稍微移动一下 到目前为止 我一直在考虑重新实现 showPopup 和 hidePopup 但不知道如何使其工作 此外 每次我尝试使用 CSS 进行移动或
  • 在哪里可以找到 Qt 的 dll 的 pdb 文件?

    我正在调试 Qt 应用程序 在哪里可以找到 Qt 的调试 dll 我在windows上使用的是vs2010 它说它需要 Qt 中的许多 dll 的 pdb 文件 从 Qt 5 9 开始 与 Windows 发行版相对应的 PDB 可作为单独
  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • 为什么下面的重叠比较总是评估为 true

    我不明白为什么以下代码有警告 指出重叠比较始终评估为真 接下来的语句永远不会被执行 QVariant MainModel data const QModelIndex index int role const if index isVali
  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 程序意外完成 - QT Creator

    我正在尝试使用 QT Creator 使用 QT 框架开发 GUI 控制台应用程序 我使用的是Windows XP 我安装了QT 4 8 3和mingw 两者均已安装 没有任何错误 然后我安装了QT Creator QT 版本 路径中的 Q
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • 如何创建QWidget的屏幕截图?

    我在 Qt Creator 中做作业 在其中绘制 QWidget 并且需要保存此 QWdiget 的某些部分 我试图解决这个问题 QPixmap pixmap pixmap copy rectangle rectangle is part
  • QT/QML Android App,点击通知栏时打开应用程序

    我为 Android 应用程序制作了一个 QT 当我单击平板电脑中上面看到的按钮通知栏时 但是 如果单击通知 我的应用程序将打开 聚焦 不知道 并显示黑色窗口 简单来说怎么做呢 我的代码是 package org ays operation
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • QtCreator 调试暂停停在代码而不是汇编处

    如何配置 QtCreator 以便在调试并按下暂停时它会显示当前正在处理的代码 现在显示汇编 无法在任何地方找到有关此问题的答案 我使用的是 Windows 7 我在 Ubuntu 16 04 中使用 Qt Creator 4 2 2 时遇
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat

随机推荐

  • 常用相机投影及畸变模型(针孔

    常用相机投影及畸变模型 1 背景 2 针孔相机投影模型及其畸变模型 2 1 缩略词和术语 2 1 世界坐标系到像素坐标系 2 2 针孔相机模型 2 2 1 世界坐标系到相机坐标系 2 2 2 相机坐标系到像素坐标系 2 3 综述 2 4 内
  • alook浏览器哪个好 夸克浏览器_简单搜索、X浏览器、夸克浏览器、Via几款极简浏览器,到底哪个最好用?...

    1 X浏览器 用过的都说X浏览器的广告拦截很强悍 大小 0 8M 无开屏页 只有安卓版本 用过 Chrome 的 都说X浏览器是好的备胎 无新闻 无推送 无后台 不足1M却小而强大 给你淋漓尽致的浏览体验 极简干净整洁的界面交互 无新闻 无
  • Android获取View宽高的几种方式

    有时我们会有基于这样的需求 当Activity创建时 需要获取某个View的宽高 然后进行相应的操作 但是我们在onCreate onStart中获取View的大小 获取到的值都是0 只是由于View的绘制工程还未完成 和在onCreate
  • 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是: 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串。

    问题描述 对于长度为5位的一个01串 每一位都可能是0或1 一共有32种可能 它们的前几个是 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串 输入格式 本试题没有输入 输出格式 输出32行
  • [极客大挑战 2019]RCE ME 1

    极客大挑战 2019 RCE ME 1 首先打开题目得到 发现是代码审计 传入的code不能大于40 并且不能包含a到z的大小写字符和1到10的数字 我们可以通过不在这个字符集里的字符进行绕过 可以采用异或和取反 这里我采用取反 绕过 执行
  • 如何画好『数据流图』和『业务流程图』

    前言 数据流图 Data Flow Diagram DFD 是一种便于用户理解和分析系统数据流程的图形工具 他摆脱了系统和具体内容 精确的在逻辑上描述系统的功能 输入 输出和数据存储等 是系统逻辑模型的重要组成部分 一 数据流图组成部分 数
  • (深度学习)Pytorch实现MLP并在MNIST数据集上验证

    Pytorch实现MLP并在MNIST数据集上验证 1 综述 2 MNIST数据集 3 代码细节说明 4 详细代码 综述 PyTorch实现MLP并在MNIST数据集上验证 是我所上的模式识别与深度学习课程的第一个实验 主要是给我们练练手熟
  • 进阶自动化测试,你一定要知道的...

    自动化测试指软件测试的自动化 在预设状态下运行应用程序或系统 预设条件包括正常和异常 最后评估运行结果 将人为驱动的测试行为转化为机器执行的过程 自动化测试框架一般可以分为两个层次 上层是管理整个自动化测试的开发 执行以及维护 在比较庞大的
  • 搭建LightPicture开源免费图床系统「公网远程控制」

    文章目录 1 前言 2 Lightpicture网站搭建 2 1 Lightpicture下载和安装 2 2 Lightpicture网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar云端设置 3 2 Cpo
  • 2021年漳州三中高考成绩查询,漳州高中学校实力排名,2021年漳州所有的高中分数线排名...

    2018年漳州市重点高中排名 排名学校名称人气所在市类型 1漳州三中1585漳州市省级示范高中 2漳浦道周中学1403漳州市省级示范高中 3诏安县第一中学1377漳州市省级示范高中 4福建省龙海第一中学1267漳州市省级示范高中 5福建省漳
  • Niginx

    基础 流程 分为正向代理和反向代理 在反向代理中 访问地址被nginx所拦截 而后 转发到其他位置 通过server进行处理 其中 server name和listen用来匹配服务器 不针对其后的具体路径 server匹配成功后 通过rew
  • linux ffmpeg开发环境搭建(基于ubuntu14.04和ffmpeg3.2)

    本文将介绍ffmpeg开发环境的安装测试和更新的步骤 基于ubuntu14 04和ffmpeg3 2 1 安装x264 1 libx264需要yasm 所以先安装yasm sudo apt get install yasm 2 安装libx
  • 修改jar包package目录结构操作方法

    开发中会遇到用第三方的jar包 有时候会出现不同的jar包 包名一致的情况 这就会引发运行时异常 找不到相应的jar包 这种问题时常困扰我们很长时间 下面提出一种解决办法 例如gson jar 1 新建一个文件夹 2 将要修改的jar包放到
  • 解读网易财报:游戏营收创新高,在线教育扬眉吐气?

    近期 不少中概股已相继对外发布新一季财报 5月18日 国内互联网巨头网易公布了2021年一季度业绩报告 从一季度的业绩表现而言 网易营收实现了新增长 超出市场及分析师的预期 在净利方面 摆脱了连续两个季度的负增长 亦超出分析师预期 受财报利
  • 读写.ini文件

    读写 ini文件 零 前言 一 写 二 读 总 零 前言 ini文件是程序的配置文件 它用来记录历史信息 界面信息 用户操作等 当然除了ini文件可以保存信息 其它文件也可以保存操作的 json txt csv等 如果数据比较少且读写不频繁
  • 机器学习算法总结--线性回归和逻辑回归

    1 线性回归 简述 在统计学中 线性回归 Linear Regression 是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析 这种函数是一个或多个称为回归系数的模型参数的线性组合 自变量都是一次
  • ChatGPT报错“Too many requests in 1 hour.Try again later“

    一 出现 Too many requests in 1 hour Try again later 怎么回事 如果您在使用ChatGPT时出现了 Too many requests in 1 hour Try again later 一小时内
  • 24张架构图把数据治理核心内容讲透了

    前言 随着信息革命和信息化的飞速发展 计算机数据量的急剧增长 数据利用和管理的重要性与日俱增 数据逐渐在信息化这个大舞台上扮演着越来越重要的角色 数据治理是企业大数据基础 企业级数据平台助力企业数字化转型 在目前数字化转型大趋势的推动下 企
  • 【机试题(实现语言:python3)】字符串运用-密码截取(最长回文子串)

    题目描述 给定一个仅包含小写字母的字符串 求它的最长回文子串的长度 所谓回文串 指左右对称的字符串 所谓子串 指一个字符串删掉其部分前缀和后缀 也可以不删 的字符串 注意 记得加上while处理多个测试用例 输入描述 输入一个仅包含小写字母
  • Qt编程 (一)

    一 Qt简介 1 Qt是什么 图形用户程序框架 是对底层应用编程接口API面向对象的封装 是一套基于C 语言的类库 专注但不局限于图形用户界面的开发 也可以进行系统调用 网络编程 数据库 2D 3D图形处理 特点 跨平台 支持Linux W