打开文档,将自定义的 demo 拷贝出来命名为 MySpin,然后 main 中这样写:
import QtQuick 2.15
import QtQuick.Window 2.15
Window {
width: 640
height: 480
visible: true
MySpin {
//复制的qt spinbox自定义示例
}
Rectangle {
//red是不存在的,正常应该报错
color: red.color
}
}
正常情况下应该报错 red 未定义,但是实际上不会有 red 未定义的错误提示,并且在关闭程序时会有异常提示:
如果删除自定义 SpinBox 中的 value 或者 up+down,运行效果就符合预期了。(在使用时初始化 value 没有异常,只是组件定义时设置初值会有异常)
解决方法,换成 Templates 中的 SpinBox 则自定义组件就可以正常使用了:
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Controls.impl 2.12
import QtQuick.Templates 2.12 as T
T.SpinBox { //换成template
id: control
value: 50
//... ...
}

MouseArea的wheel鼠标滚轮事件默认是会穿透的,需要自己onWheel接收下才能阻止事件冒泡。
测试例子:
MouseArea{
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.AllButtons
onPressed: console.log('bottom preee')
onReleased: console.log('bottom release')
onClicked: console.log('bottom click')
onWheel: console.log('bottom wheel')
Rectangle{
width: 200
height: 200
color: "green"
anchors.centerIn: parent
MouseArea{
anchors.fill: parent
hoverEnabled: true
acceptedButtons: Qt.AllButtons
//preventStealing: true
//propagateComposedEvents: true
//如果wheel不自己处理默认会穿透下去
//onWheel: console.log('top wheel') 或者写 wheel.acccpted=true
}
}
}
三、其他
1.QtCreator 中编译时 [[deprecated]] 属性没有警告
[[deprecated]] 是 C++14 标准出的一个弃用属性,可以标记一些弃用的接口
[[deprecated]]
void func1() {
}
详见文档:C++ attribute: deprecated (since C++14) - cppreference.com
在 VS2019 种使用该属性时,由于默认开启了 sdl 检查,会当作编译错误。关闭 sdl 后,默认的警告等级为 W3,会提示弃用信息(C4996)。
在 Qt Creator 中编译时默认配置没有警告信息,因为 qmake 的默认参数有 -w44996 将 4996 指定为了 w4 等级触发警告,而默认又是 w3 的警告等级,所以会忽略 C4996 的警告。
可以修改 pro 配置:
QMAKE_CXXFLAGS_WARN_ON -= -w44996
(还要注意 C++ 标准至少设置为 14,不然弃用属性也可能会被忽略,或是其他行为)
也可以使用 /WX 或者 /sdl 参数使弃用提升为错误:
QMAKE_CXXFLAGS_WARN_ON -= -w44996
#QMAKE_CXXFLAGS_WARN_ON += -WX
QMAKE_CXXFLAGS_WARN_ON += -sdl
CONFIG += c++17
#QMAKE_CXXFLAGS += -std:c++latest