Popup项目失去了opaquness

时间:2017-01-07 21:18:42

标签: qt qml qt5

我对QtQuick2的Popup QML组件有一个奇怪的问题,当我open()它时,它显示透明背景,并且它应该是不透明的。

这是我从Popup文件中调用main.qml组件的方式:

NewUser {
    id: new_user_form
}

这是组件的来源:

// 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"
    }
}

这是输出:

Transparent Popup

现在,我可以通过将NewUser.qml的来源移动到main.qml来解决此错误,现在一切正常:

这是现在已修复的' main.qml

Popup {
    id: new_user_form
    modal: true
    focus: true
    x: 10
    y: 10
    width: 300
    height: 200
}

看,弹出窗口完全是 OPAQUE

enter image description here

那么,为什么我将组件的源代码移动到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()
        }
    }
}

组件文件(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();
}

这就是bug吗?如果你点击按钮&#34;打开弹出窗口&#34;你会看到一个暗淡的屏幕,但根本没有弹出窗口。

1 个答案:

答案 0 :(得分:5)

这不是错误。请参阅,您没有使用命名空间进行模板导入。

override func viewWillAppear() {  
    super.viewWillAppear()

    // make me the delegate of the Tab View
    tabView.delegate = self

    // give the initially selected tab a reference to the User Defaults
    tabView.selectedTabViewItem?.viewController?.representedObject = UserDefaults.standard
}

override func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
    super.tabView(tabView, didSelect: tabViewItem)

    // give the newly selected tab a reference to the User Defaults
    tabViewItem?.viewController?.representedObject = UserDefaults.standard
}

为了清楚起见,import QtQuick.Templates 2.0 as T QtQuick.Templates导入提供的类型之间存在一对一的映射关系。对于QtQuick.Controls导入中可用的每种类型,QtQuick.Controls导入中存在同名的非可视模板类型。建议使用命名空间进行模板导入,以避免与QtQuick.Templates导入提供的类型重叠。