Qt 自定义标题栏,最小化、最大化、关闭窗口,双击最大化,鼠标拖动等效果实现_qt自定义标题栏_wang_chao118的博客-CSDN博客

目标是弄成这个样子

我的第一版ui

我的第二版

此处为语雀卡片,点击链接查看

难点在于界面的切换

https://github.com/mouming233/qt/tree/nihao

详情见我的github

时间节点

5月12日能够初步实现多级界面和视频嵌入的功能

多级界面

Qt之多界面切换编程_qt多界面编程_七 六 伍的博客-CSDN博客

能够做到显示多级界面

此处为语雀卡片,点击链接查看

1
2
3
4
5
6
7
void MainWindow::on_pushButton_2_clicked()
{
Server *gui1=new Server;
gui1->show();
this->hide();
}

外部程序ui嵌入qt程序

QT 如何把外部程序嵌入到QT界面_qt 嵌入其他程序_hellokandy的博客-CSDN博客

Qt源码解析2—外部程序嵌入到Qt进程界面_qt嵌入外部程序_道格拉斯范朋克的博客-CSDN博客

https://so.csdn.net/so/search?spm=1001.2101.3001.4498&q=%E5%A6%82%E4%BD%95%E5%B0%86%E5%A4%96%E9%83%A8%E7%A8%8B%E5%BA%8F%E5%B5%8C%E5%85%A5qt%E7%95%8C%E9%9D%A2%E4%B8%AD&t=&u=

能够将视频嵌入ui中

1
2
3
4
5
6
7
8
9
WId winId = (WId)FindWindow(NULL, L"img"); // 使用FindWindow函数根据窗口标题查找窗口的句柄(HWND),并将其转换为WId类型
QWindow *window = QWindow::fromWinId(winId); // 使用窗口句柄创建一个QWindow对象,该对象代表了与该句柄关联的窗口
QWidget *widget = QWidget::createWindowContainer(window, this); // 使用QWindow对象创建一个QWidget容器,将窗口嵌入到QWidget中,并将其设置为当前对象的子部件

// widget->show(); // 取消注释以显示嵌入的窗口。该行代码将嵌入的窗口显示出来
widget->setContentsMargins(10, 10, 10, 10); // 设置容器的边距为10个像素
widget->setMinimumSize(QSize(600, 400)); // 设置容器的最小尺寸为600x400像素
widget->show(); // 显示容器部件,从而显示嵌入的窗口

此处为语雀卡片,点击链接查看

如何圆角以及修改控件字体

这些都可以通过直接修改样式表style list

使用qss语言(类似于css语言

可以修改颜色以及粗细

等等之类的

【Qt】Qt样式表/QSS基本语法_qt样式表语法_CA727的博客-CSDN博客

qss语法

如何设置背景图

切记,如果背景图太大,控件,按钮会有卡顿,我使用了一张9m的图,卡的要死

icon和普通图片的区别

Icon和普通图片主要有以下几个区别:

  1. 格式不同:Icon是一种图标格式,用于系统图标、软件图标等,这种图标扩展名为.icon、.ico。常见的软件或windows桌面上的那些图标一般都是ICON格式的,而普通图片则有各种格式,如jpg、png、bmp等[6][5]。
  2. 功能不同:Icon承载了App大部分功能的引导入口,是交互设计中非常重要的一环。它有一种象征意义或隐喻性,并在日常生活中经常遇到,icon代表了一些行动、事、人、真实的、虚拟的视觉符号。相比之下,普通图片则更多的是用来传达视觉信息或者进行装饰[4]。
  3. 设计原则不同:icon的设计需要遵循一定的设计规则和原则,如易读性、视觉平衡、简洁性、一致性等,而普通图片则没有这些严格的设计原则[3]。

总的来说,icon和普通图片在格式、功能和设计原则上都有所不同。

常用获取icon网站

  1. FontAwesome (墨刀内置图标库):http://fortawesome.github.io/Font-Awesome/icons/

  2. Ionicons(iOS/Android系统图标):http://ionicons.com/

  3. The Noun Project(标志牌图标):http://thenounproject.com/

  4. Icon Finder (图标搜索站):https://www.iconfinder.com/

  5. Icon Font (阿里图标库):http://www.iconfont.cn/

  6. Google Material Icons:http://google.github.io/material-design-icons/

  7. iconmoon : https://icomoon.io

同时如何获得icon的图标

  1. 使用在线转换工具:一些网站提供在线图片到ICO图标的转换服务。您只需要选择或上传您想要转换的PNG文件,然后选择ICO作为目标格式,最后点击开始转换,就可以把PNG文件在线批量转换为ICO文件了[1]。另一个在线工具也提供了类似的服务。在该工具中,您需要先上传图片文件,然后设定ICON的尺寸,点击“立即转换”按钮,最后点击“立即下载”按钮即可保存转换好的图片[2]。
  2. 使用图片编辑工具:使用画图工具也可以将图片转换为ICO。首先,右键点击图片并选择打开方式为画图工具。然后在画图工具的左上方,点击文件选项并选择另存为,选择后缀为.bmp的24位位图。最后,生成.bmp文件后,将其后缀名改为.ico即可完成转换[7]。

这些方法均可以帮助您将普通图片转换为ICO图标,以满足您的需求。在转换过程中,如果您遇到任何问题,都可以参照相关教程进行操作。

多线程优化

如何往线程中传参

要向线程传递参数,可以通过以下几种方法:

  1. 在实例化threading.Thread对象时,通过args参数传递参数:
1
2
3
4
5
6
7
pythonCopy code
import threading

def my_thread_func(arg1, arg2):
# 线程执行的代码

thread1 = threading.Thread(target=my_thread_func, args=(arg1_value, arg2_value))

在这个例子中,my_thread_func是线程要执行的函数,arg1_valuearg2_value是要传递给线程函数的参数,通过args参数将参数传递给线程。

  1. 使用kwargs参数传递关键字参数:
1
2
3
4
5
6
7
pythonCopy code
import threading

def my_thread_func(arg1, arg2):
# 线程执行的代码

thread1 = threading.Thread(target=my_thread_func, kwargs={'arg1': arg1_value, 'arg2': arg2_value})

这种方式通过kwargs参数将参数作为关键字参数传递给线程函数。

  1. 自定义线程类并重写init方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
pythonCopy code
import threading

class MyThread(threading.Thread):
def __init__(self, arg1, arg2):
threading.Thread.__init__(self)
self.arg1 = arg1
self.arg2 = arg2

def run(self):
# 线程执行的代码

thread1 = MyThread(arg1_value, arg2_value)

在这个例子中,我们自定义了一个继承自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中是相互关联的,用于管理项目的构建过程。

  1. qmake:
    • qmake是Qt提供的项目构建工具,用于根据项目配置文件(.pro文件)生成平台特定的Makefile。.pro文件描述了项目的配置、依赖关系和构建规则。
    • qmake根据.pro文件生成Makefile后,可以使用Make工具来进行编译和构建项目。
  2. 构建(Build):
    • 构建是指根据项目配置文件(.pro文件)进行编译和链接的过程。
    • 在构建过程中,qmake根据.pro文件生成Makefile,并调用Make工具来执行编译和链接操作。
    • 构建过程通常只编译和链接那些已更改或需要更新的文件,以提高构建效率。
  3. 清除(Clean):
    • 清除操作用于删除项目构建过程中生成的中间文件和输出文件,包括可执行文件、库文件、对象文件、Makefile等。
    • 清除操作可以帮助解决构建过程中可能出现的问题,例如重新生成所有文件或清除缓存文件。
    • 清除操作通常在需要彻底清理项目并重新构建时使用。
  4. 重新构建(Rebuild):
    • 重新构建操作是在清除项目后重新执行整个构建过程。
    • 它包括重新编译所有源文件、链接库文件,并生成最终的可执行文件或库文件。
    • 重新构建操作确保项目从头开始完整地构建,而不仅仅是增量更新已更改的文件。

这些操作和工具之间的关系是:

  • qmake生成Makefile,定义了项目的构建规则和依赖关系。
  • 构建操作根据Makefile进行编译和链接,生成可执行文件或库文件。
  • 清除操作用于删除构建过程中生成的中间文件和输出文件。
  • 重新构建操作是在清除项目后重新执行整个构建过程,确保项目从头开始完整地构建。

通过使用这些操作和工具,开发者可以管理和执行项目的构建过程,根据需要进行清除、构建和重新构建,以确保项目正确地编译、链接和构建。

terminate called after throwing an instance of ‘std::bad_alloc’

问题解决,问题出现在跨线程访问gui界面上

我原先使用

1
2
3
4
5
MyThread2::MyThread2()
{
widget = new Widget();
stopped = false;
}

直接在widget.cpp中的一个线程类中直接给widget进行初始化,当线程开始调用的时候就进行了新的初始化

1
widget = new Widget();

这段代码在MyThread2对象创建时实例化了一个Widget对象,并将其指针存储在widget成员变量中。然而,这种方式可能导致问题,因为在多线程环境中,跨线程直接访问GUI组件是不安全的。

为了解决这个问题,你可以将MyThread2的构造函数修改如下:

1
2
3
4
5
MyThread2::MyThread2(Widget *parentWidget)
{
widget = parentWidget;
stopped = false;
}

然后,在创建MyThread2对象时,将Widget对象的指针传递给它,例如:

1
thread2 = new MyThread2(this);

通过这种方式,你将使用已经在主线程中创建的Widget对象,而不是在MyThread2中创建一个新的对象。

请注意,在使用多线程时,确保正确处理共享资源和跨线程访问。确保在操作GUI组件时遵循正确的线程安全原则,以避免潜在的问题。