Как показать окно сообщения с Qt Quick Controls?

Что эквивалентно QMessageBox::information(), когда кто-то хочет написать приложение QML с использованием Qt Quick Controls?


person Timmmm    schedule 13.09.2013    source источник
comment
В моем проекте я использую компонент окна QML в качестве модального для этого, который я адаптировал к своим потребностям: qt-project.org/doc/qt-5.0/qtquick/   -  person koopajah    schedule 13.09.2013
comment
Можете ли вы привести пример?   -  person Timmmm    schedule 15.09.2013


Ответы (5)


В Qt 5.2 есть MessageDialog:

http://doc.qt.io/qt-5/qml-qtquick-dialogs-messagedialog.html

import QtQuick 2.2
import QtQuick.Dialogs 1.1

MessageDialog {
    id: messageDialog
    title: "May I have your attention please"
    text: "It's so cool that you are using Qt Quick."
    onAccepted: {
        console.log("And of course you could only agree.")
        Qt.quit()
    }
    Component.onCompleted: visible = true
}
person Zmey    schedule 17.12.2013

Вы можете использовать Popup в QtQuick Controls 2:

import QtQuick.Window 2.2
import QtQuick.Controls 2.0 // or import Qt.labs.controls 1.0

Window {
    id: window
    width: 400
    height: 400
    visible: true
Button {
    text: "Open"
    onClicked: popup.open()
}

Popup {
    id: popup
    x: 100
    y: 100
    width: 200
    height: 300
    modal: true
    focus: true
    closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent
    }
}
person sayyed mohsen zahraee    schedule 06.09.2016

Хорошо, это делает работу (плохо). Импортируйте объект Window:

import QtQuick.Window 2.1

Затем добавьте это в главное окно (или, я думаю, вы можете поместить его в другой файл):

function showMessage(text, title)
{
    messageBox.text = text;
    messageBox.title = title;
    messageBox.visible = true;
}

Window {
    id: messageBox
    modality: Qt.ApplicationModal
    title: ""
    visible: false
    property alias text: messageBoxLabel.text
    color: parent.color
    minimumHeight: 100
    minimumWidth: 300
    Label {
        anchors.margins: 10
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.right: parent.right
        anchors.bottom: messageBoxButton.top
        horizontalAlignment: Text.AlignHCenter
        wrapMode: Text.WordWrap
        id: messageBoxLabel
        text: ""
    }

    Button {
        anchors.margins: 10
        id: messageBoxButton
        anchors.bottom: parent.bottom
        anchors.horizontalCenter: parent.horizontalCenter
        text: "Ok"
        onClicked: messageBox.visible = false
    }
}

Проблемы с ним:

  1. Окно можно уменьшить, чтобы текст и кнопка перекрывались.
  2. Минимальный размер окна жестко запрограммирован, а не вычисляется по размеру текста.
  3. Вы не можете выделить текст.
  4. Выглядит немного дерьмово.
person Timmmm    schedule 16.09.2013

К сожалению, его нет, по крайней мере, в поставляемых Qt Quick Controls начиная с Qt 5.1.1 :(

Вам необходимо добавить его в свой проект с помощью QObject оболочка.

person Kuba hasn't forgotten Monica    schedule 13.09.2013

// CenteredDialog.qml
import QtQml 2.2

import QtQuick 2.9
import QtQuick.Controls 2.2

Dialog {
    parent: ApplicationWindow.overlay

    x: (parent.width - width) / 2
    y: (parent.height - height) / 2

    focus: true
    modal: true

    property alias text: messageText.text

    Label {
        id: messageText

        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignHCenter

        anchors.fill: parent
    }

    standardButtons: Dialog.Ok
}

Вы можете объявить CenteredDialog { id: centeredDialog } где-нибудь, тогда в каком-то обработчике событий вы можете вызвать:

 centeredDialog.title = qsTr("Error!")
 centeredDialog.text = qsTr("Access violation")
 centeredDialog.visible = true
person Tomilov Anatoliy    schedule 29.08.2017