无题
Qt键盘事件1、背景描述当键盘被按下或者释放时候,键盘事件便会被发送给拥有键盘输入焦点的部件。QKeyEvent的key函数可以获取具体的按键,对于Qt中给定的所有按键,可以在帮助中通过Qt::Key关键字查看。需要特别说明的是,回车键在这里是Qt::Key_Return,键盘上的一些修饰键,比如Ctrl和Shift等,这里需要使用QKeyEvent的modifiers()函数来获取,可以在帮助中使用Qt::Keyboard-Modifier关键字来查看所有的修饰键。
2、代码演示新建Qt Widget应用,项目名称为mykeyevent,基类选择QWidget,项目名称mykeyevent,完成后在widget.h文件中添加函数声明:
123protected: void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event);
在到widget.cpp文件中实现函数,添加头文件#include< QKeyEvent>,测试使用Ctrl+M键来使窗口最大化
123 ...
无题
Qt实战—利用QPushButton实现按钮长按事件1、代码演示1234567891011121314// 启用长按ui->pushButton->setAutoRepeat(true); // 按钮触发的初始延迟时间ui->pushButton->setAutoRepeatDelay(500); // 长按时,按钮重复点击的时间间隔ui->pushButton->setAutoRepeatInterval(500); connect(ui->pushButton, &QPushButton::clicked, [&]{ qDebug() << "Hello" << endl;})
个人理解:
可以将上述代码放入构造函数,这样就把信号和槽绑定了。因为前面三行代码是关于button按钮的状态设置,所以可以根据自己的需求逻辑来控制。如果直接放入对应的槽函数的话,第一次长按可能没有效果哦。
有关connect()的使用,后面详解。
2 ...
无题
关于Qt中Cmake无TCP头文件问题1、问题描述使用Qt进行TCP开发,由于使用是Cmake,发现并无.pro文件,无法引入QTcpSocket模块。最初以为是未安装模块,使用Qt的维护程序查看,发现其实已经安装了,排除此问题。
后来发现是Cmake文件需要新增模块,类似于qmake下的pro文件中的模块内容,于是查看官方help文档,有这么一句话:
2、第二个问题,无法找到target这里的参数mytarget其实是项目名,但是可以使用表达式的方法${PROJECT_NAME},如图放入到Cmake文件里
如果仍然报错:
要将CMakeLists.txt中 target_link_libraries(...) 放到 add_executable(...)之后。
Qt中关于文件夹或文件的操作
Qt中关于文件夹或文件的操作1 Qt文件操作Qt中对于文件操作,利用一个例子讲明白,就说通过按钮选择一个文件并将其内容打开到文本框中,注意:需要包含对应的头文件方可执行。
读文件的方式:
首先要得到这个要打开的文件的路径,先默认打开的界面是桌面,选择路径时需要判断是否选中,这个通过isEmpty这个函数进行判断,若没有选中则进行提示,这个利用QMessageBox进行提示。
但要注意的是,默认打开txt的编码格式为utf-8,否则无法打开。
123456789101112131415161718192021222324252627//点击按钮 弹出对话框,选择文件connect(ui->pushButton,&QPushButton::clicked,[=](){ QString filePath = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\Administrator\\Desktop"); qDebug()<<filePat ...
无题
Qt环境搭建||在CLion/VS2022中进行Qt开发1、优势与缺点【1】优势
CLion本身很优秀,逐渐向VS看齐的全面的功能。也是面向未来的优秀全能开发平台。JetBrains系列用户无需重新上手
强大的错误提示和警告提示
强大的代码补全,重构,生成,分析功能
配合插件库实现生产效率的最大化
强大的调试分析能力
【2】缺点
项目需要为cmake格式,qmake格式的项目需要进行简单的转化(因为代码相同,只是编译步骤不同,但是编译结果相同)
每次开始写项目都需要做少量工作,比如配置cmakelist文件
相比QtCreator,运行速度稍慢(CLion软件占用内存更大)
不能同时安装msvc和mingw的QT库,这会导致一些问题。最好的解决方法是重装
CLion收费
2、下载安装Qt、Cmake【1】下载链接QT5.14.2下载链接
【2】Qt5Config.cmake找不到1set(CMAKE_PREFIX_PATH "E:/Qt/Qt5.12.11/5.12.11/mingw73_64/lib/cmake/Qt5")
...
无题
【Modern C++】深入理解移动语义一直以来,C++中基于值语义的拷贝和赋值严重影响了程序性能。尤其是对于资源密集型对象,如果进行大量的拷贝,势必会对程序性能造成很大影响。为了尽可能减小因为对象拷贝对程序的影响,开发人员使出了万般招式,尽可能的使用指针、引用。而编译器也没闲着,通过RVO、NRVO以及复制省略技术,来减小拷贝次数来提升代码的运行效率。
但是对于开发人员来说,使用指针和引用不能概括所有的场景,也就是说仍然存在拷贝复制等行为;对于编译器来说,RVO、NRVO等编译器行为的优化需要满足特定的条件(可以参考文章编译器之返回值优化)。为了解决上述问题,自C++11起,引入了移动语义,进一步对程序性能进行优化。
C++11新标准重新定义了lvalue和rvalue,并允许函数依照这两种不同的类型进行重载。通过对于右值(rvalue)的重新定义,语言实现了移动语义(move semantics)和完美转发(perfect forwarding),通过这种方法,C++实现了在保留原有的语法并不改动已存在的代码的基础上提升代码性能的目的。
1、值语义值语义(value se ...
无题
C++深入理解左值、右值1、背景1234567void fun(int& x) { //}int main() { fun(10); return 0;}
1error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’
其中上述报错中的rvalue就是10,也就是说10就是rvalue,那么到底什么是rvalue,rvalue的意义是什么?这就是本文的目的,通过本文,让你彻底搞清楚什么是C++下的值类别,以及如何区分左值、纯右值和将亡值。
2、历史编程语言CPL第一次引入了值类别,不过其定义比较简单,即对于赋值运算符,在运算符左边的为左值,在运算符右边的为右值。
C语言遵循与CPL类似的分类法,但是弱化了赋值的作用,C语言中的表达式被分为左值和其他(函数和非对象值),其中左值被定义为标识一个对象的表达式。不过,C语言中的左值与CPL中的左值区别是,在C语言中lvalue ...
无题
细探编译器返回值优化1、函数返回机制函数返回值的床底分为两种情况:
当返回的对象大小不超过8字节时,通过寄存器(eax edx)返回。
当返回的对象大小大于8字节时,通过栈返回。此处需要注意的是,如果返回的是struct或者class对象,即使其大小不大于8字节,也是通过栈返回的。
在通过栈返回的时候,栈上会有一块空间来保存函数的返回值。当函数结束的时候,会把要返回的对象拷贝到这块区域,对于内置类型是直接拷贝这块区域,类类型的话是调用拷贝构造函数。这块区域又称为函数返回的临时对象。
2、编译器返回值优化【1】示例代码:123456789101112131415161718192021222324252627282930class Obj {public: int n; // 构造函数 Obj() { std::cout << "in Obj() " << " " << this << std::endl; } Obj(int n) { st ...
无题
Arduino配置ESP32开发环境1、安装Arduino IDE进入Arduino官网:https://www.arduino.cc/en/software,下载最新版Arduino IDE。
2、安装ESP32开发工具包买个梯子,把那个url配置一下,一步搞定,整那么复杂,浪费时间。
参考:
(102条消息) (包教必会)Arduino环境下ESP32部署指南_Xiao&feng的博客-CSDN博客
Arduino配置ESP32开发环境 - 盛世芳华 - 博客园 (cnblogs.com)
无题
C++函数返回对象时没有调用拷贝构造函数1、疑问代码解答1234567891011121314151617181920212223242526272829303132333435363738#include <iostream>using namespace std;class Test {public: int a; Test(int x) { a = x; cout << "默认有参构造函数" << endl; } Test(const Test& test) { cout << "拷贝构造函数" <<endl; a = test.a; }};void fun1(Test test) { cout << "fun1()..." << endl;}T ...