Как получить четкий сигнал для нажатия вне диалога?

У меня есть диалог с кнопками «ДА» и «НЕТ». и я бы хотел, чтобы нажатие вне диалогового окна просто закрывало диалоговое окно и не запускало сигнал кнопки «НЕТ» (просто нажатие кнопки «НЕТ» должно вызвать его). Является ли это возможным?

Dialog {
    id: dialog
    title: "Save your Info?"
    width: parent.width/2
    modal: true
    closePolicy: Popup.CloseOnPressOutside
    standardButtons: Dialog.Yes | Dialog.No

    onAccepted: console.log("Yes clicked")
    onRejected: console.log("No clicked")
    onClosed: console.log("Dialog closed")
    Component.onCompleted: open()
}

теперь, если я щелкну за пределами диалога, он напечатает:

qml: No clicked

qml: Dialog closed

Возможно ли, чтобы просто закрыть диалоговое окно, щелкнув за его пределами (фактически отменить его), и НЕ отклонять его перед закрытием?

Обновить: На самом деле я просто хотел иметь 3 разных сигнала для «Да», «Нет» и «Отмена», щелкая снаружи.

2
0
422
2

Ответы 2

Измените модальность на false (чтобы вы могли нажимать снаружи, пока closePolicy НЕ CloseOnPressOutside, модальный диалог блокирует ваши нажатия), измените closePolicy на что-нибудь еще (не CloseOnPressOutside), но не оставляйте его по умолчанию. Добавьте MouseArea для обработки нажатия вне диалога.

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Close dialog my marea")
    Dialog {
        id: dialog
        title: "Title"
        width: parent.width/2
        modal: false
        closePolicy: Popup.CloseOnReleaseOutsideParent // something I never use
        standardButtons: Dialog.Yes | Dialog.No
        onAccepted: console.log("Yes clicked")
        onRejected: console.log("No clicked")
        onClosed: console.log("Dialog closed")
        Component.onCompleted: open()

    }
    MouseArea{
        anchors.fill: parent
        onClicked: {
            dialog.close()

        }
    }

}

Спасибо за ответ, Мохаммад. но я попытался найти лучший способ, и, наконец, я нашел этот подход. Я надеюсь, что это поможет и другим.

Dialog {
    id: dialog
    title: "Title"
    width: parent.width/2
    modal: true
    closePolicy: Popup.CloseOnPressOutside
    footer: DialogButtonBox {
        Button {
            text: qsTr("Yes")
            DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole
        }
        Button {
            text: qsTr("No")
            DialogButtonBox.buttonRole: DialogButtonBox.DestructiveRole
        }
    }

    onAccepted: console.log("Yes Btn clicked")
    onRejected: console.log("Dialog closed")
    onDiscarded: {
        console.log("No Btn clicked")
        close()
    }

    Component.onCompleted: open()
}

Нет, этот код не предоставляет то, что вы хотите ... в соответствии с вашим ответом .. когда нажата «Нет», диалоговое окно будет разрушен (не отклонено) .. в то время как при нажатии вне диалогового окна все еще остается «Отклонено» .. это не то, о чем вы просили .. ни хороший способ поп вверх диалог.

Mohammad Kanan 14.04.2018 20:30

Также код ответа сбивает с толку .. сначала кнопка «Нет» должна быть связана с ролью отклонения DialogButtonBox.RejectRole, а не с DialogButtonBox.DestructiveRole .. это ваше требование! Второе: onRejected: console.log("Dialog closed") неправильный .. это должен быть onRejected: console.log("No Btn clicked") .. этот код не соответствует требованиям и использование сложных сообщений.

Mohammad Kanan 14.04.2018 20:38

Извините, возможно, вы правы, и в моем вопросе не было достаточно комментариев, на самом деле я просто хотел иметь 3 разных сигнала для «Да», «Нет» и «Отмена», щелкая снаружи.

Musa 15.04.2018 07:26

Вы не обновили свой вопрос, и ваше решение не работает для обоих сценариев ... независимо от количества кнопок ... нажатие извне вызовет роль отклонения.

Mohammad Kanan 15.04.2018 07:35

Другие вопросы по теме