一、Qt Widgets 问题交流
1.
二、Qt Quick 问题交流
1.Qt5 ApplicationWindow 不能使用父组件 Window 的 transientParent 属性
ApplicationWindow 使用 transientParent 报错:
"ApplicationWindow.transientParent" is not available due to component versioning.
这个属性是 C++ 类 QWindow 定义的,而且比较特殊,用的 Q_PRIVATE_PROPERTY,版本也较高是 13
Q_PRIVATE_PROPERTY(QWindow::d_func(), QWindow* transientParent MEMBER transientParent WRITE setTransientParent NOTIFY transientParentChanged REVISION 13)
Qt Controls 引入的版本较低(尖括号里的版本号):
qmlRegisterRevision<QQuickWindow, 2>(uri, 2, 0);
qmlRegisterRevision<QWindow, 3>(uri, 2, 0);
qmlRegisterRevision<QQuickWindowQmlImpl, 3>(uri, 2, 2);
本来想在 main 函数重新注册成高版本,不过会报错,那还是改源码重新编译吧:
qmlRegisterRevision<QWindow, 15>("QtQuick.Controls", 2, 0);
plugin cannot be loaded for module "QtQuick.Controls": Namespace 'QtQuick.Controls' has already been used for type registration
2.QML 中动态创建的对象没变量引用可能会被 gc 释放
比如 Qt.createComponent() + createObject() 创建的对象;或者 C++ 创建但是 ObjectOwnership 是 JavaScriptOwnership 的对象,都需要注意。
3.ColorAnimation 不能调用 start 开始变色,RotationAnimation 却可以执行
ColorAnimation 的示例只有 ColorAnimation on color {} 和 Transition 两种,从组件名字上看 ColorAnimation 就是对 attach 的对象变色,其实只有 RotationAnimation 有默认属性,ColorAnimation 是没有的:
QQuickColorAnimation::QQuickColorAnimation(QObject *parent)
: QQuickPropertyAnimation(parent)
{Q_D(QQuickPropertyAnimation);d->interpolatorType = QMetaType::QColor;d->defaultToInterpolatorType = true;d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType);
}QQuickRotationAnimation::QQuickRotationAnimation(QObject *parent)
: QQuickPropertyAnimation(*(new QQuickRotationAnimationPrivate), parent)
{Q_D(QQuickRotationAnimation);d->interpolatorType = QMetaType::QReal;d->interpolator = QVariantAnimationPrivate::getInterpolator(d->interpolatorType);d->defaultProperties = QLatin1String("rotation,angle");
}
所以你调用 start 他也不知道干啥,需要设置 property 为 color:
Rectangle {id: rectwidth: 200height: 200color: "red"ColorAnimation {id: anitarget: rectproperty: "color"from: "white"to: "black"duration: 200}MouseArea {anchors.fill: parentonClicked: ani.start()}}
4.图片缩放
没找到合适的图来体现不同设置的区别,暂略
// 默认缩放,有像素锯齿,相当于 QImage 的 FastTransformationImage {width: 400height: 250source: "qrc:/img.png"fillMode: Image.PreserveAspectFit}// smooth 和多重采样的效果差不多,比较模糊Image {width: 400height: 250source: "qrc:/img.png"smooth: truefillMode: Image.PreserveAspectFit}// 和 QImage 的 SmoothTransformation 差不多,略有不同Image {width: 400height: 250source: "qrc:/img.png"sourceSize: Qt.size(width, height)fillMode: Image.PreserveAspectFit}
三、其他
1.搜索代码中的中文字符串
程序做翻译的时候需要找出里面的中文字符进行处理,比如 Qt 框架加上 tr 等。
先百度中文的正则范围:[\u4e00-\u9fa5],再在两边加上双引号或者单引号组成最终的正则。
在 VSCode 中需要勾选正则表达式搜索:
".*[\u4e00-\u9fa5]+.*"
Qt Creator 也支持正则搜索:
但是会提示不支持 \U 等:
我们可以替换 Unicode 编码为对应的中文进行搜索:
".*[一-龥]+.*"
如果只搜索不带 tr 的字符串,就搜双引号前不是 r 字母的字符串:
[^r]\(".*[\u4e00-\u9fa5]+.*"
注意 QML 可以单引号字符串,所以最好统一风格,搜索起来简单点。还有就是编码的时候规范一点,别到处写一堆空格,比如 tr(空格或者换行+"字符串内容"+空格或者换行) 。
2.QMake 中 $$ 拼接宏的时候,如果是没定义的,不会报错
如 pro 中这样写:
DESTDIR = $$PWD/bin/$$ABCD
其中 ABCD 未定义,但是不会报错,而是在 bin 目录下生成了 exe