一、Qt Widgets 问题交流
1.
二、Qt Quick 问题交流
1.Q_REVISION 标记的信号槽或者 REVISION 标记的属性,在子类中访问
Q_REVISION 是 Qt 用来做版本控制的一个宏。以 QQuickWindow 为例,继承后去访问 REVISION 标记的 opacity 属性或者 Q_REVISION 标记的 closing 信号,会报错提示 is not available:
#include <QQuickWindow>
class MyWindow : public QQuickWindow
{
public:
using QQuickWindow::QQuickWindow;
};
qmlRegisterType<MyWindow>("Test", 1, 0, "MyWindow");
import QtQuick 2.15
import Test 1.0
MyWindow {
width: 640
height: 480
visible: true
title: qsTr("Test")
opacity: 0.5
onClosing: console.log("close")
}
只需要用 qmlRegisterRevision 把基类也注册下,并指定一个更大的 VERSION 号就行了。
qmlRegisterType<MyWindow>("Test", 1, 0, "MyWindow");
qmlRegisterRevision<QQuickWindow, 15>("Test", 1, 0);
qmlRegisterRevision<QWindow, 15>("Test", 1, 0);
注意,如果基类有多层,把带 VERSION 属性的都注册下才行,比如 QWindow 是 QQuickWindow 父类也要注册下。
2.Qt5 点击按钮关闭子窗口时,按钮的 hovered 没有重置
给按钮加一个 ToolTip 关联 hovered 显示,子窗口 close 再 show,原来的 ToolTip 没有消失,鼠标晃一下才会消失,因为此时按钮的 hovered 没重置。
Qt5.15.2 测试 close 后再 show ToolTip 还在,hovered 未重置,但 hide 没问题;
Qt6.6.1 测试 close 没问题 hovered 已重置,但 hide 后再 show ToolTip 会闪一下。
测试代码:
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
Window {
id: root
width: 640
height: 480
visible: true
title: qsTr("Main Window")
Window {
id: window
width: 400
height: 300
visible: false
title: qsTr("Sub Window")
Button {
text: hovered ? "hovered" : "close"
ToolTip.visible: hovered
ToolTip.text: text
onHoveredChanged: console.log("hoverd", hovered)
onClicked: {
console.log("clicked")
window.close()
}
}
onClosing: console.log("on closing")
}
Row {
anchors.centerIn: parent
Button {
text: "show"
onClicked: window.show()
}
}
}
三、其他
1.Windows 平台设置 Qt::FramelessWindowHint 无边框后,在副屏幕最大化时,自动切换为全屏把任务栏挡住了
Qt Bug Tracker:https://bugreports.qt.io/browse/QTBUG-51327
一般最大化时 Visibility 是 Maximized,但是无边框状态下自动切换为 FullScreen,会把任务栏挡住。根据 Qt Bug Tracker 上的记录来看,在 5.15.9, 6.3.0 Beta2, 6.4.0 Beta1 进行了修复。如果使用的是 Qt5.15 的低版本,可以编译高版本的 qwindows 插件替换下。
文件路径如:5.15.2\msvc2019\plugins\platforms\qwindows.dll
2.Windows 平台设置 Qt::CustomizeWindowHint 自定义标题栏后,标题栏的位置会保留一个白条
FramelessWindowHint 去掉了标题栏和边框,CustomizeWindowHint 只去掉了标题栏,但是边框还在,如果能直接修改去掉标题栏残留的白条那比用 FramelessWindowHint 再做阴影方便点。
这个叫赵宇航的老哥提交了一个修复:https://codereview.qt-project.org/c/qt/qtbase/+/384712