![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Qt
文章平均质量分 65
请在beep声后留言
Genuine knowledge comes from practice.
展开
-
Qt 数据库QSqlDatabase使用记录
记录一些在QT中使用QSqlDatabase操作数据库时,需要注意的地方。原创 2023-12-15 14:44:31 · 307 阅读 · 0 评论 -
Qt 鼠标点击事件穿透
【问题描述】在近期开发的过程中遇到这样一个场景:透明的子窗口覆盖于父窗口之上,但需要父窗口中的部件对鼠标点击事件进行正常的响应。正常情况下,由于子窗口覆盖于父窗口之上,鼠标点击事件会被子窗口中的部件获取,而不会被父窗口中的部件获取到,要解决这个问题,就需要让鼠标点击事件穿透子窗口,下发到父窗口的对应部件中。【解决思路】要实现事件的穿透,最关键的就是setAttribute(Qt::WA_TransparentForMouseEvents, true);的使用。这个方法能将当前窗口及其子部件的鼠标事原创 2022-01-10 22:58:30 · 8794 阅读 · 4 评论 -
Qt TreeView选中节点取消背景色
改动前未选中节点时选中节点时会发现虽然已经给TreeView::item:selected和TreeView::branch:selected都设置了background:transparent,但选中节点时依然带有默认的背景色改动后最后修改了TreeView的show-decoration-selected属性,莫名地解决了QTreeView { border:none; background: #0D202D; show-decoration-selected:原创 2021-12-01 15:35:12 · 1354 阅读 · 0 评论 -
Qt 图片与base64互转
图片转base64QImage image(":/image/wrong");QByteArray ba;QBuffer buf(&ba);image.save(&buf, "png");qDebug() << ba.toBase64();buf.close();base64转图片QString p_b;//base64字符串QPixmap image;image.loadFromData(QByteArray::fromBase64(p_b.toLocal转载 2021-11-29 15:47:12 · 580 阅读 · 0 评论 -
Qt 界面实现的一些小技巧【更新中】
分割线的实现QFrame * line = new QFrame();line->setFrameShape(QFrame::HLine);line->setFrameShadow(QFrame::Sunken);QLabel适应文字内容大小QLabel label;label.setText("label");label.adjustSize(); label.setFixedWidth(label.width());label.setFixedHeight(labe原创 2021-07-08 17:17:45 · 555 阅读 · 1 评论 -
yaml-cpp的编译与使用
编译环境Windows10VS2019cmake-3.19.8-win64-x64准备工具yaml-cpp源码 点此下载yaml-cpp的编译将下载好的yaml-cpp-master.zip进行解压在源码目录下创建一个build文件夹并进入这个文件夹mkdir buildcd build使用cmake指令生成库文件cmake ..接着将会看到在build目录下有一个名为YAM_-CPP.sln的文件,用VS打开它对ALL_BUILD生成解决方案,成功生成后,会在buil原创 2021-07-05 09:06:21 · 1378 阅读 · 0 评论 -
VLC-Qt的编译与使用 windows10+VS2019+qt5.15
最近要在程序中实现一个能够播放本地视频的内嵌播放器,试过用ffmpeg、QtAV来实现,不是播放的速度有问题,就是在播放flv视频文件时无法调整进度,因此寄希望于vlc-qt。下面是我在windows10 VS2019环境下编译vlc-qt的详细步骤准备工作编译环境windows10 VS2019下载源码包我是用Git工具直接下载的,打开Git Bash,键入git clone git://github.com/vlc-qt/vlc-qt.git进行克隆,完成后源码默认被保存在C:\Users\x原创 2021-06-25 17:53:34 · 2898 阅读 · 11 评论 -
MediaInfo在VS2019下的编译和使用
准备工作下载源码 下载地址MediaInfo编译将下载好的压缩包进行解压,用VS打开MediaInfoLib.sln,生成解决方案(我选择的是Release版本,64位)原创 2021-06-24 10:30:23 · 520 阅读 · 1 评论 -
QtAV的编译、安装和使用
准备工作下载QtAV官方提供的编译好的依赖库 下载地址解压后得到下载QtAV-1.12.0源码 下载地址解压后得到QtAV编译原创 2021-06-15 13:56:06 · 2318 阅读 · 1 评论 -
Qt LINK : fatal error LNK1104: 无法打开文件“xxx.lib”
遇到这个问题实在太多次了,必须记录一下。。【问题现象】原来.pri文件中引入库文件的代码是这样的LIBS += -L$$PWD/$$strPath/$$strLib/ -lavcodec -lavfilter -lavformat -lswscale -lavutil -lswresample -lavdevice -llibrtmp报错信息如下但去掉 -llibrtmp 后重新构建就不会报错,说明问题出在引入librtmp上。【解决过程】试着将llibrtmp库引入语句单独写一行LI原创 2021-06-10 15:32:31 · 8190 阅读 · 2 评论 -
Qt 递归与非递归遍历文件【深度遍历/广度遍历/迭代器】
在实现文件传输这一功能的过程中,经常需要遍历文件夹,下面对QT中文件夹的遍历方法做一个整理。文件夹遍历可以归纳为三个主要的步骤:①通过QDir访问目标文件夹②过滤所需的文件类型③获取过滤后的文件信息列表④遍历文件信息列表,取出文件路径并递归调用遍历函数。具体代码如下:实现方法一(递归,深度遍历,代码非常简洁)void CSystemManager::fileTraverse(QString path){ QDir dir(path); if(!dir.exists())原创 2021-01-05 09:53:48 · 1098 阅读 · 0 评论 -
QtCreator 构建套件时出现红色感叹号的解决方法
【问题现象】大意是64位的编译器无法为32位的Qt版本生成代码。P.S:原来选择的编译器是Microsoft Visual C++ Compiler 16.7.30330.147(amd64),对应的ABI是x86-windows-msvc2019-pe-32bit)【解决方法】对该套件重新进行配置,将64位的ABI改为32位。鼠标移入可以看到编译器对应的ABI的版本,找到版本为x86-windows-msvc2019-pe-32bit的编译器。回到“Kits”选项卡。在指示处找到刚才原创 2020-12-14 15:56:23 · 16913 阅读 · 6 评论 -
Qt 记一次文件传输引发的各种问题【readLine()的使用/缓冲区的flush()刷新机制】
今天在实现文件传输功能的时候,发现图片文件数据传到本地后没有按预期显示出来。核心代码如下:void CFileTransferThread::slotStartTransferFile(QString srcPath, QString extend, QString ip, quint16 port){ //进入这个函数,根据srcPath找到目标文件,以只读方式打开,注意文件不能一次性读取 QFile file(srcPath); file.open(QIODevice::R原创 2020-11-09 15:19:51 · 4197 阅读 · 2 评论 -
Qt LNK2001:无法解析的外部符号 未找到文件moc_XXX.obj
由于在运行项目的过程中遇到这个bug实在太多次,特此记录一下,方便今后遇到同样的问题时能更快地解决。STEP1 检查代码第一步肯定要先检查我们的代码是否正确,主要要关注的地方有:① 头文件中,在类的定义里是否添加Q_OBJECT② 类的头文件和源文件是否有缺漏③ 在类的定义中声明的方法是否都有实现STEP2 执行qmake之前报这个错误的时候qmake是有效的,但这次失效了。STEP3 手动添加moc文件这个方法是我在网上看到的,系统提示缺少哪个类的moc文件,就在该.cpp文件中添加#原创 2020-09-16 20:29:03 · 5799 阅读 · 1 评论 -
QtWebApp的使用【在Qt中搭建HTTP服务器】(三)
在前面的学习中,我们编写了几个控制器,这些控制器通过将散布在C ++源文件中的硬编码片段进行级联,来生成HTML文档。源代码看起来没有很好的组织结构,生成的HTML文档也很丑陋。如果要生成更复杂的网站,那现有的代码结构会使这个过程变得很痛苦。因此,整个世界的Web开发人员都在一些替代方案之间进行选择:反其道而行之,将程序代码插入HTML文档,例如JSP和PHP就选择了这种方法。在客户端使用Javascript(AJAX),将服务器提供的原始数据展示在屏幕上。将数据合并到准备好的HTML文件中,然后原创 2020-09-03 10:24:48 · 5029 阅读 · 7 评论 -
QtWebApp的使用【在Qt中搭建HTTP服务器】(二)
目录处理用户输入Session 会话什么是Session为什么要使用Session技术?cookieHTTP重定向国际化静态文件这篇博客介绍了QtWebApp中,form表单、session、cookie的使用。处理用户输入Web应用程序通常处理用户输入。我们将制作一个登录表单,以了解它的使用方法。创建一个新类 LoginController。同样,它源自HttpRequestHandler。//logincontroller.h:#ifndef LOGINCONTROLLER_H#defi原创 2020-09-01 17:29:10 · 5085 阅读 · 2 评论 -
QtWebApp的使用【在Qt中搭建HTTP服务器】(一)
用Qt和QtWebApp能够实现在C++中开发HTTP Web服务器应用程序。首先,需要先安装Qt的软件开发工具包。点此下载其次,下载最新的QtWebApp库。点此下载下载并解压缩QtWebApp ZIP文件。你将会看到:如何使用QtWebApp1)将QtWebApp.zip文件解压到文件夹中,并创建一个名为“ MyFirstWebApp”的新Qt控制台项目。然后,建立如下文件结构:2)将以下行添加到MyFirstWebApp项目的项目文件中:QT += networkinclude(原创 2020-09-01 09:14:35 · 23528 阅读 · 14 评论 -
Qt的main函数参数argc和argv学习总结
1、int main(int argc, char *argv[]):其中argv为指针的指针可以char **argv 或者 char *argv[] 或者 char argv[][]来表示,argc为整数2、具体用法看下面的例子(假设程序的名称为program ):(1)当执行程序时只输入./program,则由操作系统传来的参数为argc=1,表示只有程序名称,argv[0]指向输入的程序路径及名称。(2)当执行程序时输入./program -10,则由操作系统传来的参数为argc=2,表示除转载 2020-08-25 14:21:16 · 3014 阅读 · 0 评论 -
TCP的粘包、拆包问题及其解决方法
最近花了挺多时间跟TCP通信死磕,原创 2020-08-11 10:27:13 · 1222 阅读 · 4 评论 -
C++调用多态函数时的坑【隐式类型转换】
昨晚在写bug的过程中,发现了一个让人摸不着头脑的错误。先交代一下发生这个错误的背景:1)定义了一个名为TCP_MSG_HEAD的宏,值为0xBBAA55AA,作为目标TCP数据包的报文头,#define TCP_MSG_HEAD = 0XBBAA55AA;2)调用socket的readAll()方法,返回一个字节数组,也就是当前接收缓冲区里字节流的所有内容,并追加到内存缓冲区。QByteArray readArray=m_pServerTcpSocket->readAll();原创 2020-08-06 15:52:58 · 422 阅读 · 0 评论 -
Qt学习(十九)—— XML
XML文件和HTML文件一样,是有头有尾的——有开始标签就有对应的闭合标签。XML是用来存储数据的,HTML是用来显示数据的。所以XML标签灵活很多,不像HTML那样,表格就必须是<table>、一级标题就必须是<h1>,XML的标签可以由我们自己来定义,比如在xml中存储一些学生数据:<?xml version="1.0" encoding="UTF-8"?><info> <stu id="1"> <name>joey&l原创 2020-08-02 14:36:57 · 664 阅读 · 0 评论 -
Qt开发之通过配置.pro文件封装动态链接库(dll)
这两天在实现将类封装成动态链接库的过程中遇到了很多问题,在此记录一下如何利用.pro文件和.pri文件管理我们的项目,并实现、使用动态链接库(DLL)。这是项目的结构树:工程名为tableViewSocket,其中,项目的MVC放在tableView这个子工程中,TCP通讯功能放在Network中,Network被封装成动态链接库。以下是如何将这样一个结构的工程通过.pro和.pri构建出来的步骤。一、创建一个空的工程填好工程名和工程路径,Next到底。Qt在Test工程下自动生成了一个空的原创 2020-07-31 16:41:31 · 4750 阅读 · 3 评论 -
Qt学习(十八)—— 线程应用之画图
今天的目标是将之前学习的绘图和线程结合起来,来实现用线程绘图(……好绕)回顾一下创建一个子线程的流程:1)创建一个自定义线程类,并实现它的线程处理函数(本质是类的成员函数)。2)在主窗口类中创建一个自定义线程对象,再创建一个QThread子进程对象,然后用moveToThread()方法将自定义线程对象移动到子线程中。3)调用start()方法启动子线程。4)调用connect()方法,用户界面触发某些信号时,调用子线程中的槽函数。5)在子线程的槽函数中,也可以向主线程发送信号。6)调用con原创 2020-07-22 15:32:12 · 2899 阅读 · 4 评论 -
Qt学习(十七)—— 线程
为什么要学习线程假设一个单任务程序中有一段非常复杂的数据处理,需要占用很多内存,就很容易使程序发生卡顿、崩溃的现象。比如,在传输大型文件的过程中,发现进度条停滞了,这时候如果我们不耐烦地多点了几下窗口,就很可能会导致窗口无响应。所以,像这种复杂的数据处理不应该放在界面上,而应该把它放到线程中。...原创 2020-07-21 22:46:45 · 919 阅读 · 0 评论 -
Qt学习(十六)—— TCP文件传输
今天学习TCP文件传输。下面是服务端向客户端发送文件的流程:服务器向客户端发送文件,需要先选择一个文件,然后获取文件的文件名和大小。在文件传输的过程中,往往都要有一个进度条指示当前文件传输的进度,这个进度是由服务器端提供的,那客户端要如何得知文件传输的进度?这就需要服务端在往客户端发送数据之前,先发送一个携带上文件信息的数据过去。客户端从服务端接收到携带文件信息的数据后,要按照一定的协议对字符串进行解析,获取文件的大小、文件名等信息。有了文件名,客户端就可以在本地创建一个同名的文件。接着,服务端开始读原创 2020-07-20 23:07:07 · 786 阅读 · 0 评论 -
Qt学习(十五)—— 网络通信之UDP
UDP就像写信,写明地址也不能确保对方能收到,TCP就像打电话,只有确定对方是我们要找的人才能进行通话。在Qt的UDP通信中,不区分客户端和服务端,只区分发送端和接收端。无论是发送端还是接收端,都只有一个套接字,也就是QUdpSocket。此外,UDP通信中没有监听listen(),只有绑定bind(),往套接字中读写数据用的是readDataGram()和writeDataGram()。P.S:datagram是数据报 / 数据包 / 数据报文的意思和TCP相同的地方是,发送端向接收端发送数据时,会原创 2020-07-19 20:47:29 · 1926 阅读 · 1 评论 -
Qt学习(十四)—— 网络通信之TCP
TCP有两个套接字,一个是socket,监听套接字,负责监听,一个是accept,通信套接字,负责建立连接(链接)?bind 绑定 比如打电话需要知道电话号码 绑定的作用可以简单认为是固定一个端口,如果不固定,那么这个端口是随机的。listen是服务端用来监听的。总之服务端要完成的就是:socket、bind、listen。客户端也有socket套接字它需要主动链接,所以还有一个connect客户端主动向服务端发起connect链接。服务端有accept确定建立好了链接,没有建立链接的时候它是原创 2020-07-17 15:32:57 · 2866 阅读 · 2 评论 -
Qt学习(十三)—— 文件读写
文件的读写应用场景十分广泛,也是我们必须要学习的。以下是Qt中,文件系统的结构图:文件系统结构图QFile读文件//Widget.h#ifndef WIDGET_H#define WIDGET_H#pragma execution_character_set("utf-8")#include <QWidget>#include <QGridLayout>#include <QPushButton>#include <QTextEdit>c原创 2020-07-15 22:20:57 · 2376 阅读 · 2 评论 -
Qt学习(十二)—— 绘图
绘图主要涉及到三个类QPainter、QPaintEngine、QPainDevice。其中,常用的是QPaiter和QPaintDevice。注意:画图需要重写绘图事件虚函数。如果在窗口绘图,必须放在绘图事件里实现。绘图事件由内部自动调用,比如窗口需要重绘的时候(即状态改变,如窗口大小改变),当然也可以人为调用。void painterEvent(QPaintEvent *ev);P.S:使用QPainter要引入头文件<QPainter>下面我们来创建一个QPainter原创 2020-07-15 08:33:37 · 1597 阅读 · 0 评论 -
Qt学习(十一)—— 事件
什么是事件事件(event)是由系统或者 Qt 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。例如,在执行主窗口的exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函原创 2020-07-13 22:37:34 · 397 阅读 · 0 评论 -
Qt学习(十)—— 样式表
除了合理的布局之外,要使界面更加美观,还需要用样式表来进行一定的设计。样式表语法基础Qt的样式表与CSS的语法规则几乎完全相同。每个样式表规则都有着下面的形式:selector{attribute:value}其中,选择器(selector)部分通常是一个类名(如QComboBox),当然还有其他语法形式。属性(attribute)部分是一个样式表属性的名字,(如color),值(value)部分是赋给该属性的值(如red)。QComboBox{color:red;}为了使用原创 2020-07-13 11:18:47 · 507 阅读 · 0 评论 -
Qt学习(九)—— 布局管理器
没有布局的界面不仅不美观,而且窗口中的内容难以对窗口的大小进行自适应,因此我们还需要学习Qt中的布局管理。水平/垂直/网格布局布局的管理往往是先局部,后全局。在创建布局对象的时候给新对象指定父窗口,就等于给传入的窗口设置了布局。或者对父窗口调用setLayout()...原创 2020-07-10 11:25:25 · 431 阅读 · 0 评论 -
Qt学习(八)—— 常用控件QLabel、QTextEdit
QLabelQLabel是最常用的控件之一,我们可以用它来显示文本、图片和动画等。要使用QLabel,还是需要先引入<QLabel>头文件。显示文字显示下面我们来实现一个最简单的只显示文字的QLabel:可以看到字符串并没有完整地显示出来,而且由于没有指定坐标,坐标默认为相对于父元素的(0,0),所以QLabel覆盖在MainWindow自带的菜单栏上了,导致菜单栏不能拖动。P.S:字符串没有完整地显示出来是因为QLabel类中有一个成员函数设置了QLabel的默.原创 2020-07-09 16:04:47 · 3093 阅读 · 0 评论 -
Qt学习(七)—— QDialog
模态和非模态对话框当一个对话窗口弹出时,如果你不对它进行操作就无法操作其它窗口,这种对话框就成为模态对话框。反之则称为非模态对话框。模态对话框在Qt中,模态对话框是如何实现的呢?不仅需要用到QDialog类,还需要用到exec()。在Qt的框架中有提到过,exec()使程序进入一个循环,直到用户进行操作才结束循环。所以,要实现模态对话框也需要用到它,只有当用户对对话框作出反馈,才能继续后续的操作。下面用几行代码体会什么是模态对话框:#include "MainWindow.h"#原创 2020-07-08 22:27:34 · 1139 阅读 · 2 评论 -
Qt学习(六)—— QMainWindow
菜单栏菜单栏要使用菜单栏控件,需要先引入<QMenuBar>和<QMenu>头文件。创建一个带菜单栏的QMainWindow语句如下:#include "MainWindow.h"#include "ui_MainWindow.h"#include <QMenuBar>#include <QMenu>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),原创 2020-07-08 11:41:33 · 2722 阅读 · 1 评论 -
Qt学习(五)—— QWidget对象模型
在Qt中,所有窗口及窗口控件都是从QWidget直接或间接派生出来的。对象模型在Qt中创建对象的时候会提供一个Parent对象指针,下面来解释这个parent到底是干什么的。QObject是以对象树的形式组织起来的。当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针。这相当于,在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children(原创 2020-07-07 15:16:56 · 588 阅读 · 0 评论 -
Qt学习(四)—— 坐标系统
坐标系统move()属于QWidget类,QWidget又是所有界面元素的基类,所以所有界面元素对象都可以使用move()。对于父窗口(主窗口),坐标系统相对于屏幕,原点相对于屏幕左上角,x往右递增,y往下递增。对于子窗口或者控件,坐标系统对象于父窗口,原点相对于父窗口的空白区域左上角(不包括边框)。...原创 2020-07-07 14:37:37 · 546 阅读 · 0 评论 -
Qt学习(三)—— lambda表达式
lambda表达式lambda 表达式是 C++ 11 新增的新特性,在 Qt 中配合信号一起使用。使用lambda表达式的好处在于不用定义槽函数,也不用指定信号接收者。为了使用 lambda 表达式,需要在项目文件中配置 C++ 11 的规则。//.pro文件中CONFIG += C++11lambda表达式实际上是一个匿名函数对象。坐标系统内存回收机制菜单栏 & 工具栏核心控件和浮动窗口...原创 2020-07-07 14:13:02 · 970 阅读 · 0 评论 -
Qt开发之踩雷日记
报错信息:C:\Users\MSI-NB\Desktop\03_SignalAndSlot\SubWidget.cpp:4: error: C2533: “SubWidget::{ctor}”: 构造函数不能有返回类型但构造函数中并没有返回类型啊??原因:定义类的时候没有加 ;构造函数默认把整个类作为返回值了。报错信息:C:\Users\MSI-NB\Desktop\03_SignalAndSlot\SubWidget.h:8: error: C2011: “SubWidge..原创 2020-07-07 10:56:27 · 1697 阅读 · 0 评论 -
Qt学习(二)—— 信号和槽
Qt的介绍Qt是一个跨平台的C++用户图形界面应用程序框架。Qt的框架选择基类QMainWindow主要用于PC端,即带菜单栏的windows窗口QWidget是其他类的基类QDialog对话框填写类名类名指向所选的基类(父类)中的派生类(子类)//main.cpp#include "mywidget.h"//QApplication应用程序类//Qt头文件没有.h//头文件和类名一样#include <QApplication>int ma原创 2020-07-06 23:01:39 · 906 阅读 · 0 评论