解决方案
CSharp运行matlab库时报错libmwlapack: load error: mkl.dll.的解决方案MWMCR:EvaluateFunction error找不到指定模块
win11离线安装donet3.5的方法
Qt6离线安装方式
QFile无法打开文件明明文件已经存在却无法打开open failed路径或者卷标不正确奇葩问题
关于启用https访问Mrdoc网站cloudflare服务支持http和https同时访问
VS编译工程提示错误error C1083: 无法打开包括文件: “stddef.h”: No such file or directory该文件指向win10 kits安装windows SDK10具体方法
关于Matlab调用Python时出现的错误解决方案Python 命令需要支持的 Cpython 版本。请参阅 <a href="matlab:helpview([docroot'/matlab/helptargets.map’]
Docker构件镜像时 Sending build context to Docker daemon远远超过原镜像大小docker build超出大小原因
QEnum的正确使用方法QMetaEnum::fromType方式总是为空isValid总是为false的解决方案和方法通过键获取值通过值获取键Q_ENUM注册失败
关于静态库的使用的注意事项动态库改静态库的不同static library
windows上Qt编译源码open source building vs2022 qt5.15.17版本编译环境问题 环境配置编译QT依赖安装
Qt5.15.17源码编译的最终版windows下使用VisualStudio编译QtWebEngine组件遇到的问题及解决方案使用VS2019进行编译启用GPU硬件加速显卡OpenGL(最终版)
Qt在MainWindows上悬浮一个QWidget窗体,窗体内有四个按钮,保持QWidget在Mainwin的正中间并设置为透明背景黑色设置无效
windows脚本bat建立目录软链接 系统找不到指定的路径
rdkafka接收数据慢的解决方案发送完了却没有接收完的问题
Qt通过QSS样式将QToolButton下拉弹出菜单的提示按钮由右边让其底部居中显示
使用Qss设置背景图片的一些问题记录不生效,效率低,背景图片不能拉伸
CMakeList管理一个工程引用另外一个工程库该注意
CMakeList设置输出bin和lib目录
CMakeList中实现编译完成后自动拷贝指定文件到指定目录copy
QT工程中文出现乱码的解决方案编译后中文显示不正确显示乱码utf-8编码编译编码
windows下编译Minio cpp客户端编译过程
本文档使用 MrDoc 发布
-
+
首页
Qt在MainWindows上悬浮一个QWidget窗体,窗体内有四个按钮,保持QWidget在Mainwin的正中间并设置为透明背景黑色设置无效
# 说明 Qt在MainWindows上悬浮一个QWidget窗体,窗体内有四个按钮,保持QWidget在Mainwin的正中间并设置为透明背景; 经过测试,却发现QWidget中的QPushButton可以设置为透明,但是QWidget却无法设置为透明,为了找到设置无效的原因,做了很多的测试... # 解决方案 先上一段由AI根据我的需求写的代码: ```cpp #include <QMainWindow> #include <QWidget> #include <QPushButton> #include <QVBoxLayout> #include <QHBoxLayout> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 设置主窗口大小 resize(800, 600); //如果设置这句,将会使得主窗体MainWindow透明,能够看到桌面背景 //setAttribute(Qt::WA_TranslucentBackground); //添加QWebEngineView,并将该view显示到主界面 auto *m_mianView = new QWebEngineView(this); m_mainView->setUrl(QUrl("www.baidu.com")); this->setCentalWindow(m_mainView); // 创建悬浮窗口 createFloatingWidget(); } private: void createFloatingWidget() { // 创建悬浮Widget QWidget *floatingWidget = new QWidget(this); //关键代码 // 设置透明背景,都不需要设置 //floatingWidget->setAttribute(Qt::WA_TranslucentBackground); //floatingWidget->setStyleSheet("background:transparent;"); // 创建4个按钮 QPushButton *button1 = new QPushButton("按钮1", floatingWidget); QPushButton *button2 = new QPushButton("按钮2", floatingWidget); QPushButton *button3 = new QPushButton("按钮3", floatingWidget); QPushButton *button4 = new QPushButton("按钮4", floatingWidget); // 设置按钮样式(可选) QString buttonStyle = "QPushButton {" "background-color: rgba(50, 50, 50, 150);" "color: white;" "border: 1px solid gray;" "border-radius: 5px;" "padding: 5px;" "min-width: 80px;" "}" "QPushButton:hover {" "background-color: rgba(70, 70, 70, 200);" "}"; //button1->setStyleSheet(buttonStyle); //button2->setStyleSheet(buttonStyle); //button3->setStyleSheet(buttonStyle); //button4->setStyleSheet(buttonStyle); //也可以使用整体设置所有的QpushButton的样式 this->setStyleSheet(buttonStyle); // 创建布局 QHBoxLayout *layout = new QHBoxLayout(floatingWidget); layout->addWidget(button1); layout->addWidget(button2); layout->addWidget(button3); layout->addWidget(button4); layout->setSpacing(10); layout->setContentsMargins(10, 10, 10, 10); // 设置悬浮窗口无边框,不需要设置 //floatingWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool); //Qt::Tool不能设置,否则不显示!! // 调整大小并居中 //floatingWidget->adjustSize(); centerFloatingWidget(floatingWidget); // 显示悬浮窗口 floatingWidget->show(); } void centerFloatingWidget(QWidget *widget) { if (!widget || !widget->parentWidget()) return; QWidget *parent = widget->parentWidget(); widget->move(parent->width()/2 - widget->width()/2, parent->height()/2 - widget->height()/2); } protected: //尺寸改变时,重新计算并移动位置 void resizeEvent(QResizeEvent *event) override { QMainWindow::resizeEvent(event); // 主窗口大小改变时重新居中悬浮窗口 QWidget *floatingWidget = findChild<QWidget*>(); if (floatingWidget) centerFloatingWidget(floatingWidget); } }; ``` == 关键代码在这句: QWidget *floatingWidget = new QWidget(this);== 在Qt的窗体渲染过程中,父窗体会先渲染,然后子窗体再渲染。这是由Qt的 "Painter's Algorithm"(画家算法) 决定的,即从最底层的父容器开始,逐步向上绘制子控件。 Qt窗体渲染顺序 1. 父窗体先渲染 Qt的渲染流程是从 最外层的父容器(如 MainWindow) 开始。 父窗体的 paintEvent() 会先执行,绘制背景、边框等。 然后才会递归渲染子控件。 2. 子窗体后渲染 子控件(如 QWidget、QPushButton)的 paintEvent() 在父窗体之后执行。 子控件会覆盖父窗体的对应区域(除非设置了透明或半透明)。 QWidget *floatingWidget = new QWidget(this); //背景显示为黑色 QWidget *floatingWidget = new QWidget(nullptr); //背景能显示为透明 floatingWidget->setAttribute(Qt::WA_TranslucentBackground); //但需要指定这个属性,并且不以MainWindow为参考了,且是一个独立窗体。 == QWidget *floatingWidget = new QWidget(m_mianView); //背景显示为透明,并且居中在MainWindow,其他属性均无需指定! == 编辑:myhappyandy
虚拟世界
2025年7月25日 22:41
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码