《QDebug 2023年5月》

news2024/10/1 21:44:29

一、Qt Widgets 问题交流

1.在 VS 中双击打开 ui 文件后,过一会儿 Qt Designer 就闪退

我是在 Windows11 + VS2019/2022 环境遇到这个问题,解决方法是设置 Run in detached window 为 True。

点击 "扩展->QT VS Tools->Options",对话框中左侧选择 "Qt->General";或者点击 "工具->选项" 也能进到这个设置界面。

网上也有其他相关的解决方案,比如:

VS打开Qt的ui界面后闪退(ui无法打开文件)的解决办法_vs打开qt闪退_严就方法的博客-CSDN博客

二、Qt Quick 问题交流

1.Qt6 Controls 组件样式自定义报错且样式异常

根据 Qt5 的经验,我新建一个 MyButton.qml 文件自定义按钮组件,import Controls 模块,然后对样式自定义。

import QtQuick
import QtQuick.Controls

Button {
    id: control
    implicitWidth: 90
    implicitHeight: 30
    text: qsTr("Button")

    contentItem: Text {
        text: control.text
        font: control.font
        horizontalAlignment: Text.AlignHCenter
        verticalAlignment: Text.AlignVCenter
    }

    background: Rectangle {
        border.color: control.down ? "cyan" : "red"
        border.width: 1
        color: "gray"
    }
}

但是运行后报错:QML Rectangle: The current style does not support customization of this control... ...

同时,样式也不完全是我们设置的样式 。

先说解决方案:

1.参考 Quick Controls 源码 import QtQuick.Templates 中的类型自定义;

2.import QtQuick.Controls.Basic 使用 Basic 样式自定义(或者其他非 native 样式);

3.main 函数设置 QQuickStyle::setStyle("Basic") 全局设置 Basic 就不用单独 import Basic 了(或者其他非 native 样式)。

接下来找到源码报错的地方:

//qquickcontrol.cpp
void QQuickControlPrivate::warnIfCustomizationNotSupported(QObject *control, QQuickItem *item, const QString &propertyName)
{
    static const bool ignoreWarnings = [](){
        return qEnvironmentVariableIntValue("QT_QUICK_CONTROLS_IGNORE_CUSTOMIZATION_WARNINGS");
    }();
    if (ignoreWarnings)
        return;

    if (!control->property("__notCustomizable").toBool()
            || (item && item->property("__ignoreNotCustomizable").toBool()))
        return;

    qmlWarning(item ? item : control).nospace() << "The current style does not support customization of this control "
        << "(property: " << propertyName << " item: " << item << "). "
        "Please customize a non-native style (such as Basic, Fusion, Material, etc). For more information, see: "
        "https://doc.qt.io/qt-6/qtquickcontrols2-customize.html#customization-reference";
}
//DefaultButton.qml
import QtQuick
import QtQuick.Controls
import QtQuick.Controls.impl
import QtQuick.Templates as T
import QtQuick.NativeStyle as NativeStyle

T.Button {
    id: control

    readonly property bool __nativeBackground: background instanceof NativeStyle.StyleItem
    readonly property bool __notCustomizable: true
    //... ...
}

原来是默认的 native 样式代码里标注了 __notCustomizable 属性,我尝试覆盖这个属性,但也只是警告没了,hover 样式仍然是错误的。

原来是类型有没导出的属性,没法覆盖掉,所以还是得替换掉 native 版本的实现:

import QtQuick
import QtQuick.Controls.impl
import QtQuick.NativeStyle as NativeStyle

NativeStyle.DefaultButton {
    id: control

    background: NativeStyle.Button { ... ...}

    NativeStyle.Button {
        id: hoverButton
        control: control
        x: background.x
        y: background.y
        width: background.width
        height: background.height
        useNinePatchImage: false
        overrideState: NativeStyle.StyleItem.AlwaysHovered
        opacity: control.hovered ? 1 : 0
        visible: opacity !== 0
        Behavior on opacity { NumberAnimation { duration: hoverButton.transitionDuration } }
    }

    contentItem: IconLabel { ... ... }
}

2.Qt6 QML 在 QVariant 解析上的一点小区别

先上代码:

#pragma once
#include <QObject>
#include <QVariant>

class MyItem : public QObject
{
    Q_OBJECT
public:
    using QObject::QObject;

    Q_INVOKABLE QVariant getChar() {
        return QVariant::fromValue(char{65});
    }
    Q_INVOKABLE QVariant getInt8() {
        return QVariant::fromValue(int8_t{65});
    }
    Q_INVOKABLE QVariant getUint8() {
        return QVariant::fromValue(uint8_t{65});
    }
};
    MyItem {
        id: item
        Component.onCompleted: {
            var c8 = item.getChar()
            var i8 = item.getInt8()
            var u8 = item.getUint8()
            console.log(typeof c8, c8)
            console.log(typeof i8, i8)
            console.log(typeof u8, u8)
        }
    }

如果是 Qt5,打印如下:

唯独 int8 转成了特殊的对象显示为字符 A,其他是数字,并且这个对象还不能用 parseInt 转换,只能用属性绑定或赋值来中转一下转成 int。

但是在 Qt6,三者的类型统一了:

三、其他

1.Qt5 和 Qt6 非整数倍 dpi 缩放的测试

Qt5 的时候对 dpi 非整数倍缩放的支持不太好,Qt6 在这方面进行了优化,测试一下。

测试环境:Win10 + Qt5.15.2/Qt6.5.1

测试代码:https://github.com/gongjianbo/MyTestCode/tree/master/Qt/TestQt_20230529_DpiScaleTest

主要是对比 Qt::HighDpiScaleFactorRoundingPolicy::PassThrough 的效果,以及 qt.conf 设置 WindowsArguments=dpiawareness=0 的效果。

实测 qt.conf 的方式没啥改进仍然比较模糊,而 PassThrough 在 Qt6 修复了很多渲染问题,效果看起来还不错。

//qt.conf
[Platforms]
WindowsArguments=dpiawareness=0
//main.cpp
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    // 这是 qt6 的默认策略,而 qt5 默认是没开启缩放的
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
    // qt5 默认 Round 四舍五入,qt6 默认 PassThrough 允许小数值
    QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
#endif

有一些要注意的地方:Qt5 和 Qt6 默认字体设置有区别;Qt6 默认开启 dpi 缩放还把 AA_DisableHighDpiScaling 给废掉了,我测试了一些其他的接口来恢复不缩放的效果:

    // 关闭缩放
    // https://doc.qt.io/qt-6/highdpi.html
    // 参见文档,仅用于测试,且不支持 mac os 和 wayland 平台
    qputenv("QT_ENABLE_HIGHDPI_SCALING", "0");

    // 设置固定 dpi
    // windows 默认是 96 dpi,mac 似乎是 72
    // AA_Use96Dpi 在 mac os 以及 qt6 似乎没效果这里用变量设置
    qputenv("QT_FONT_DPI", "96");

下面是对比图:

a.Qt5 使用 PassThrough 在 125% 缩放下的效果:

Widgets:QPainter 绘图模糊,pt 字号的文字显示不完整;

QML:框线会有加粗的情况,如果是有 layer 会比较模糊,文字用 native 渲染有锯齿或者撕裂感。

a.Qt6 使用 PassThrough 在 125% 缩放下的效果 :

效果感觉还不错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/585078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通俗易懂理解到底什么是DevOps技术(Windows程序员视角)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来聊聊到底什么是DevOps。 相信很多小伙伴为什么搞懂DevOps&#xff0c;已经不知道查了多少论坛的帖子和资料了&#xff0c;但还是很困惑的话&#xff0c;那不妨来看看我这个帖子。希望能有助于你的…

CASA模型NPP及碳源、碳汇模拟

CASA模型 CASA模型是一个基于过程的遥感模型(Potteret al&#xff0c;1993&#xff1b;Potter et al&#xff0c;1994)&#xff0c;耦合了生态系统生产力和土壤碳、氮通量&#xff0c;由网格化的全球气候、辐射、土壤和遥感植被指数数据集驱动。模型包括土壤有机物、微量气体通…

Android Jatpack--ViewModel

1.ViewModel ViewModel是Jetpack的一部分。 ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel类让数据可在发生屏幕旋转等配置更改后继续留存。 ViewModel出现的背景&#xff1a; ①职责分离 Android开发中&#xff0c;在页面较为简单的情况下&…

【社区分享 - 低代码篇】浪潮低代码引擎UBML和低代码平台inBuilder

【社区分享 - 低代码篇】浪潮低代码引擎UBML和低代码平台inBuilder 文章目录 【社区分享 - 低代码篇】浪潮低代码引擎UBML和低代码平台inBuilder1、inBuilder低代码平台介绍2、inBuilder低代码平台操作指导 1、inBuilder低代码平台介绍 1&#xff09;首先介绍了低代码平台相关背…

分布式应用之zookeeper集群+消息队列Kafka

1.Zookeeper集群的相关知识 1.1 zookeeper的概念 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能…

00后卷王自述,我真的很卷吗?

前段时间我去面试了一个软件测试公司&#xff0c;成功拿到了offer&#xff0c;薪资也从10k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟有些工作了3到4年的可能还没有我的高。 在公司一段时间后大家都说我是卷王&#xff0c;其…

CCP4i2之蛋白结构自动构建:Autobuild protein

在解析x射线蛋白晶体结构过程中&#xff0c;最常用的方法就是分子置换&#xff0c;即进行molecular replacement&#xff08;MR&#xff09;时&#xff0c;输入合适的同源蛋白作为model&#xff0c;以及目标蛋白的mtz和sequence&#xff0c;来完成相位解析的过程。 相位求解成…

TDengine 基于SpringBoot 框架和Druid 连接池的TDengine Demo示例

一、前文 TDengine 入门教程——导读 二、JDBC Demo下载 TDengine 官方提供的示例程序源码位于TDengine / TDengine 的 TDengine/examples/JDBC下: JDBCDemo&#xff1a;JDBC 最简单的demo。connectionPools&#xff1a;HikariCP, Druid, dbcp, c3p0 等连接池中使用 taos-jdb…

【刷题之路Ⅱ】迷宫问题升级版——找最短路径

【刷题之路Ⅱ】迷宫问题升级版——找最短路径 一、题目描述二、解题1、方法1——暴力递归更新栈1.1、思路分析1.2、先将栈实现以下1.3、代码实现 一、题目描述 原题连接&#xff1a; 地下迷宫 题目描述&#xff1a; 小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅…

C语言深度解析--操作符

目录 操作符 1.算数操作符 2.移位操作符 左移操作符<<&#xff1a; 右移操作符>>&#xff1a; 3.位操作符 按位与&&#xff1a; 按位或 | &#xff1a; 按位异或 ^ &#xff1a; 4.赋值操作符 5.单目操作符 6.关系操作符 7.逻辑操作符 8.条件操作…

这所985复试竟可直接加50分,若复试有科研经历!

本期为大家整理热门院校-“大连理工大学”的择校分析&#xff0c;这个择校分析专题会为大家结合&#xff1a;初试复试占比、复试录取规则&#xff08;是否公平&#xff09;、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源于研…

vue:实现简单的拖拽功能

背景 平常做业务很容易遇到拖拽功能&#xff0c;没做之前总觉得会很复杂&#xff0c;今天来看一下到底是怎么实现的。 拖拽API 这是 HTML5 新增的 API&#xff0c;当给元素设置 draggable"true" 的时候&#xff0c;这个元素就可以拖拽了。 <div draggable&quo…

JavaScript全解析——Express框架介绍与入门

本文为千锋资深前端教学老师带来的【JavaScript全解析】系列&#xff0c;文章内含丰富的代码案例及配图&#xff0c;从0到1讲解JavaScript相关知识点&#xff0c;致力于教会每一个人学会JS&#xff01; 文末有本文重点总结&#xff0c;可以收藏慢慢看~ 更多技术类内容&#xf…

Linux 安装nodejs、npm、yarn、nrm(超实用)

前言&#xff1a;初衷想要本地通过dockerfile文件直接把项目打包到linux服务器&#xff0c;不用再本地加载再上传等&#xff0c;后续再贴上配置文件 一、什么是nodejs 来自官网的介绍&#xff0c;Node.js 是一个开源的跨平台 JavaScript 运行时环境。它几乎是任何类型项目的流…

AI加持,Fabric让Power BI生态更强大

在Microsoft Build 2023上微软正式推出了Microsoft Faric预览版&#xff0c;它将Power BI、Azure Synapse、Azure Data Factory的优点整合到了一个统一的SasS服务中。数据工程师、数仓工程师、数据科学家、数据分析师和业务用户可以在Fabric中无缝协作&#xff08;微软这是要卷…

MinIO:基于Go实现的高性能、兼容S3协议的对象存储

High Performance Object Storage for AI 译文&#xff1a;MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储 文档 项目地址&#xff1a;https://github.com/minio/minio官网地址&#xff1a;https://min.io/文档地址&#xff1a;https://docs.min.io/Software Developme…

PyTorch-优化器以及网络模型的修改

目的&#xff1a;优化器可以将神经网络中的参数根据损失函数和反向传播来进行优化&#xff0c;以得到最佳的参数值&#xff0c;让模型预测的更准确。 1. SGD import torch import torchvision from torch import nn from torch.nn import Sequential, Conv2d, MaxPool2d, Flat…

Spring Security 笔记

在Spring Security 5.7.0-M2&#xff0c;我们弃用了 WebSecurityConfigurerAdapter &#xff0c;因为我们鼓励用户转向使用基于组件的安全配置。 为了帮助大家熟悉这种新的配置风格&#xff0c;我们编制了一份常见用例表和推荐的新写法。 配置HttpSecurity Configuration pu…

重磅发布!面向装备制造业服务化转型白皮书

《面向装备制造业服务化转型白皮书》 关于白皮书 《面向装备制造业服务化转型白皮书》通过调研160余家装备制造企业的服务化路径及模式&#xff0c;研讨支持企业开展服务型制造的系统化方案&#xff0c;希望为装备制造业服务化转型&#xff0c;探索切实有效的路径以供参考。 …

Web 自动化测试案例——关闭某视频网站弹出广告以及打开登录框输入内容

文章目录 &#x1f4cb;前言&#x1f3af;自动化测试&#x1f9e9;环境的搭建 &#x1f3af;案例介绍&#x1f4dd;最后 &#x1f4cb;前言 人生苦短&#xff0c;我用Python。许久没写博客了&#xff0c;今天又是久违的参与话题的讨论&#xff0c;话题的内容是&#xff1a;如何…