qt优化
Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现_qt自定义标题栏_wang_chao118的博客-CSDN博客
目标是弄成这个样子





我的第一版ui

我的第二版
难点在于界面的切换
https://github.com/mouming233/qt/tree/nihao
详情见我的github
时间节点
5月12日能够初步实现多级界面和视频嵌入的功能
多级界面
Qt之多界面切换编程_qt多界面编程_七 六 伍的博客-CSDN博客
能够做到显示多级界面
1 | void MainWindow::on_pushButton_2_clicked() |
外部程序ui嵌入qt程序
QT 如何把外部程序嵌入到QT界面_qt 嵌入其他程序_hellokandy的博客-CSDN博客
Qt源码解析2—外部程序嵌入到Qt进程界面_qt嵌入外部程序_道格拉斯范朋克的博客-CSDN博客
能够将视频嵌入ui中
1 | WId winId = (WId)FindWindow(NULL, L"img"); // 使用FindWindow函数根据窗口标题查找窗口的句柄(HWND),并将其转换为WId类型 |
如何圆角以及修改控件字体
这些都可以通过直接修改样式表style list
使用qss语言(类似于css语言
可以修改颜色以及粗细
等等之类的

【Qt】Qt样式表/QSS基本语法_qt样式表语法_CA727的博客-CSDN博客
如何设置背景图
切记,如果背景图太大,控件,按钮会有卡顿,我使用了一张9m的图,卡的要死
icon和普通图片的区别
Icon和普通图片主要有以下几个区别:
- 格式不同:Icon是一种图标格式,用于系统图标、软件图标等,这种图标扩展名为.icon、.ico。常见的软件或windows桌面上的那些图标一般都是ICON格式的,而普通图片则有各种格式,如jpg、png、bmp等[6][5]。
- 功能不同:Icon承载了App大部分功能的引导入口,是交互设计中非常重要的一环。它有一种象征意义或隐喻性,并在日常生活中经常遇到,icon代表了一些行动、事、人、真实的、虚拟的视觉符号。相比之下,普通图片则更多的是用来传达视觉信息或者进行装饰[4]。
- 设计原则不同:icon的设计需要遵循一定的设计规则和原则,如易读性、视觉平衡、简洁性、一致性等,而普通图片则没有这些严格的设计原则[3]。
总的来说,icon和普通图片在格式、功能和设计原则上都有所不同。
常用获取icon网站
FontAwesome (墨刀内置图标库):http://fortawesome.github.io/Font-Awesome/icons/
Ionicons(iOS/Android系统图标):http://ionicons.com/
The Noun Project(标志牌图标):http://thenounproject.com/
Icon Finder (图标搜索站):https://www.iconfinder.com/
Icon Font (阿里图标库):http://www.iconfont.cn/
Google Material Icons:http://google.github.io/material-design-icons/
iconmoon : https://icomoon.io
同时如何获得icon的图标
- 使用在线转换工具:一些网站提供在线图片到ICO图标的转换服务。您只需要选择或上传您想要转换的PNG文件,然后选择ICO作为目标格式,最后点击开始转换,就可以把PNG文件在线批量转换为ICO文件了[1]。另一个在线工具也提供了类似的服务。在该工具中,您需要先上传图片文件,然后设定ICON的尺寸,点击“立即转换”按钮,最后点击“立即下载”按钮即可保存转换好的图片[2]。
- 使用图片编辑工具:使用画图工具也可以将图片转换为ICO。首先,右键点击图片并选择打开方式为画图工具。然后在画图工具的左上方,点击文件选项并选择另存为,选择后缀为.bmp的24位位图。最后,生成.bmp文件后,将其后缀名改为.ico即可完成转换[7]。
这些方法均可以帮助您将普通图片转换为ICO图标,以满足您的需求。在转换过程中,如果您遇到任何问题,都可以参照相关教程进行操作。
多线程优化
如何往线程中传参
要向线程传递参数,可以通过以下几种方法:
- 在实例化threading.Thread对象时,通过args参数传递参数:
1 | pythonCopy code |
在这个例子中,my_thread_func是线程要执行的函数,arg1_value和arg2_value是要传递给线程函数的参数,通过args参数将参数传递给线程。
- 使用kwargs参数传递关键字参数:
1 | pythonCopy code |
这种方式通过kwargs参数将参数作为关键字参数传递给线程函数。
- 自定义线程类并重写init方法:
1 | pythonCopy code |
在这个例子中,我们自定义了一个继承自threading.Thread的子类MyThread,并重写了init方法来接收传递的参数。在run方法中编写线程的执行代码。
以上是几种常用的方法来向线程传递参数。根据具体的情况选择适合的方式来传递参数给线程函数或线程类。
D:.cpp:242: error: invalid initialization of non-const reference of type ‘QString&’ from an rvalue of type ‘QString’ widget->ui_show(requestData);
错误提示表明在调用 ui_show 函数时,尝试将一个右值类型的 QString 对象传递给了一个非常量引用类型的参数。
在 ui_show 函数的声明中,参数 QString &str 的类型是非常量引用,它要求传入一个可修改的左值类型的 QString 对象。然而,requestData 是一个临时创建的右值类型的 QString 对象,它无法被绑定到非常量引用类型的参数。
为了解决这个问题,您可以将 ui_show 函数的参数类型修改为 const QString &str,即使用常量引用来接收参数。这样可以接受常量和非常量的 QString 对象,并且避免了对临时对象的引用。
修改后的 ui_show 函数声明如下所示:
1 | void Widget::ui_show(const QString &str); |
然后在 widget.cpp 文件中相应的位置调用 ui_show 函数时,将 requestData 作为常量引用传递:
1 | widget->ui_show(requestData); |
通过这样的修改,应该能够解决该错误。
[Qt Quick] No rule to make target
[Qt Quick] No rule to make target问题解决办法_weixin_30293135的博客-CSDN博客
清除(Clean)、重新构建(Rebuild)、构建(Build)和qmake在Qt中是相互关联的,用于管理项目的构建过程。
- qmake:
- qmake是Qt提供的项目构建工具,用于根据项目配置文件(.pro文件)生成平台特定的Makefile。.pro文件描述了项目的配置、依赖关系和构建规则。
- qmake根据.pro文件生成Makefile后,可以使用Make工具来进行编译和构建项目。
- 构建(Build):
- 构建是指根据项目配置文件(.pro文件)进行编译和链接的过程。
- 在构建过程中,qmake根据.pro文件生成Makefile,并调用Make工具来执行编译和链接操作。
- 构建过程通常只编译和链接那些已更改或需要更新的文件,以提高构建效率。
- 清除(Clean):
- 清除操作用于删除项目构建过程中生成的中间文件和输出文件,包括可执行文件、库文件、对象文件、Makefile等。
- 清除操作可以帮助解决构建过程中可能出现的问题,例如重新生成所有文件或清除缓存文件。
- 清除操作通常在需要彻底清理项目并重新构建时使用。
- 重新构建(Rebuild):
- 重新构建操作是在清除项目后重新执行整个构建过程。
- 它包括重新编译所有源文件、链接库文件,并生成最终的可执行文件或库文件。
- 重新构建操作确保项目从头开始完整地构建,而不仅仅是增量更新已更改的文件。
这些操作和工具之间的关系是:
- qmake生成Makefile,定义了项目的构建规则和依赖关系。
- 构建操作根据Makefile进行编译和链接,生成可执行文件或库文件。
- 清除操作用于删除构建过程中生成的中间文件和输出文件。
- 重新构建操作是在清除项目后重新执行整个构建过程,确保项目从头开始完整地构建。
通过使用这些操作和工具,开发者可以管理和执行项目的构建过程,根据需要进行清除、构建和重新构建,以确保项目正确地编译、链接和构建。
terminate called after throwing an instance of ‘std::bad_alloc’

问题解决,问题出现在跨线程访问gui界面上
我原先使用
1 | MyThread2::MyThread2() |
直接在widget.cpp中的一个线程类中直接给widget进行初始化,当线程开始调用的时候就进行了新的初始化
1 | widget = new Widget(); |
这段代码在MyThread2对象创建时实例化了一个Widget对象,并将其指针存储在widget成员变量中。然而,这种方式可能导致问题,因为在多线程环境中,跨线程直接访问GUI组件是不安全的。
为了解决这个问题,你可以将MyThread2的构造函数修改如下:
1 | MyThread2::MyThread2(Widget *parentWidget) |
然后,在创建MyThread2对象时,将Widget对象的指针传递给它,例如:
1 | thread2 = new MyThread2(this); |
通过这种方式,你将使用已经在主线程中创建的Widget对象,而不是在MyThread2中创建一个新的对象。
请注意,在使用多线程时,确保正确处理共享资源和跨线程访问。确保在操作GUI组件时遵循正确的线程安全原则,以避免潜在的问题。