我有一个Popup来自QtQuick2的QML组件的奇怪问题,当我这样做open()时,它显示透明背景,它应该是不透明的.
这是我Popup从main.qml文件中调用组件的方式:
NewUser {
id: new_user_form
}
Run Code Online (Sandbox Code Playgroud)
这是组件的来源:
// File: NewUser.qml
Popup {
id: new_user_popup
modal: true
focus: true
x: 10
y: 10
width: 300
height: 200
Rectangle {
anchors.fill: parent
color: "transparent"
border.color: "red"
}
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
现在,我可以通过移动NewUser.qmlinto 的源来修复此错误,main.qml现在一切看起来都很好:
这是现在'固定' main.qml:
Popup {
id: new_user_form
modal: true
focus: true
x: 10
y: 10
width: 300
height: 200
}
Run Code Online (Sandbox Code Playgroud)
看,弹出窗口完全是OPAQUE:
那么,如果我将组件的源代码移动到一个单独的文件中,为什么main.qml会丢失不透明度呢?我的main.qml有很多其他的东西,但我相信它与弹出窗口无关,ID也是唯一的.我希望这不是QT 5.8 RC(我用于开发)的一些问题,它还不是官方的,但很快就会出现.
编辑:
我相信我发现了一个错误.该问题可以通过Qt 5.8和Qt 5.7重现
要重现,请使用以下文件创建项目:
主文件:
//main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
NewUser {
id: new_user_form
}
Button {
text: "open popup"
onClicked: {
new_user_form.open()
}
}
}
Run Code Online (Sandbox Code Playgroud)
组件文件(NewUser.qml)
//File: NewUser.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Controls.Material 2.0
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.3
import Qt.labs.settings 1.0
import QtQuick.Templates 2.0
Popup {
id: new_user_popup
modal: true
focus: true
x: 10; y:10;
height: 200; width: 300;
Button {
text: "Test button"
}
}
//File: qtquickcontrols2.conf
; This file can be edited to change the style of the application
; See Styling Qt Quick Controls 2 in the documentation for details:
; http://doc.qt.io/qt-5/qtquickcontrols2-styles.html
[Controls]
Style=Material
[Universal]
Theme=Light
;Accent=Steel
[Material]
Theme=Light
;Accent=BlueGrey
;Primary=BlueGray
//File: main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QLatin1String("qrc:/main.qml")));
return app.exec();
}
Run Code Online (Sandbox Code Playgroud)
这样做的bug呢?如果单击"打开弹出窗口"按钮,您将看到一个灰色的屏幕,但根本没有弹出窗口.
这不是一个错误.请参阅,您没有使用命名空间进行模板导入.
import QtQuick.Templates 2.0 as T
Run Code Online (Sandbox Code Playgroud)
为清楚起见,在QtQuick.Templates和QtQuick.Controls导入提供的类型之间存在一对一的映射.对于QtQuick.Controls导入中可用的每种类型,导入中都存在同名的非可视模板类型QtQuick.Templates.建议使用命名空间进行模板导入,以避免与导入提供的类型重叠QtQuick.Controls.