Как закрывать QDialog компонент для precionar внутри него или для clickear вне dialog

У меня есть эти два файла:

Один Dialog, который обладает двумя классами, SimpleDialog и SimpleDialogItem.
Проблема, которая у меня есть, что он состоит в том, что я желаю, что SimpleDialog закройтесь, когда он кликнет вне этого, или когда нажмут на компонент его (SimpleDialogItem).

Второй файл test.py, который код, следует testear, что MainLayout это QWidget.

Dialog.py

# coding=utf-8
from PyQt4.QtCore import Qt
from PyQt4.QtGui import *


class SimpleDialog(QDialog):
    def __init__(self, title=None):
        QDialog.__init__(self)
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool)
        self.setMinimumWidth(280)

        self.__inWidget = []
        self.__textColor = "#212121"

        font = QFont()
        font.setFamily("Roboto Medium")
        font.setPixelSize(20)

        self.__title = QLabel()
        self.__title.setFont(font)
        self.__title.setWordWrap(True)
        self.__title.hide()
        if title:
            self.setTitle(title)

        self.__vLayout = QVBoxLayout()
        self.__vLayout.setSpacing(0)
        self.__vLayout.setContentsMargins(0, 0, 0, 8)

        textLayout = QVBoxLayout()
        textLayout.setAlignment(Qt.AlignTop)
        textLayout.setMargin(24)
        textLayout.setSpacing(0)
        textLayout.addWidget(self.__title)

        contentLayout = QVBoxLayout()
        contentLayout.setSpacing(0)
        contentLayout.setMargin(0)
        contentLayout.addLayout(textLayout)
        contentLayout.addLayout(self.__vLayout)

        widget = QWidget()
        widget.setContentsMargins(0, 0, 0, 0)
        widget.setLayout(contentLayout)

        main = QVBoxLayout()
        main.setSpacing(0)
        main.setMargin(0)
        main.addWidget(widget)

        backBoard = QHBoxLayout()
        backBoard.addLayout(main)
        backBoard.setContentsMargins(20, 20, 20, 20)
        self.setLayout(backBoard)

    def focusOutEvent(self, *args, **kwargs):
        print 56
        self.close()

    def addItem(self, simpleDialogItem):
        """ SimpleDialog.addItem(SimpleDialogItem)
        Agrega un item al SimpleDialog
        """
        if type(simpleDialogItem) == SimpleDialogItem:
            self.__vLayout.addWidget(simpleDialogItem)
            self.__inWidget.append(simpleDialogItem)
        else:
            raise TypeError("Se espera un SimpleDialogItem y se recibio: " + type(simpleDialogItem))

    def setTitle(self, title):
        """ SimpleDialog.setTitle(str)
        Establece el titulo del SimpleDialog
        """
        self.__title.setText(title)
        self.__title.show()


class SimpleDialogItem(QPushButton):
    def __init__(self, icon=None, text=None):
        """ SimpleDialogItem(icon=path, text=str)
        Item utilizado en SimpleDialog
        """
        QPushButton.__init__(self)

        self.__text = QLabel()
        self.__text.setWordWrap(True)
        self.__text.setContentsMargins(24, 0, 24, 0)

        self.__layout = QHBoxLayout()
        self.__layout.addWidget(self.__text)
        self.__layout.setSpacing(0)
        self.__layout.setContentsMargins(0, 4, 0, 4)
        self.setFixedHeight(48)

        self.setLayout(self.__layout)
        if text:
            self.setText(text)

    def setText(self, text):
        """ SimpleDialogItem.setText(str)
        Establece el texto del widget
        """
        self.__text.setText(text)

test.py

import sys

from PyQt4.QtGui import QApplication
from PyQt4.QtGui import QHBoxLayout
from PyQt4.QtGui import QPushButton, QDialog

from Dialog import SimpleDialog, SimpleDialogItem



class Main(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        b = QPushButton("button")
        b.released.connect(self.hola)

        l = QHBoxLayout()
        l.addWidget(b)

        self.setLayout(l)

    def hola(self):
        t = "Three line wrapped text goes here making it wrap to next line and continues longer to be here "
        tt = "You'll lose all photos and media."
        ttt = "You'll lose all photos and media."
        sd = SimpleDialog(title="Are you sure?")
        self.item = SimpleDialogItem(text=t, icon="slide_1.jpg")
        self.item.released.connect(self.chao)
        item2 = SimpleDialogItem(text=tt)
        item3 = SimpleDialogItem(text=ttt)
        sd.addItem(self.item)
        sd.addItem(item2)
        sd.addItem(item3)
        sd.exec_()

    def chao(self):
        print "Hola mundo!"


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Main()
    window.activateWindow()
    window.show()

    sys.exit(app.exec_())

Код не обнаруживает focusOut в SimpleDialog. Какое-то решение?

2
задан 20.01.2017, 15:19
2 ответа

Только ты должен менять Qt.Tool в Qt.Popup:

self.setWindowFlags(Qt.FramelessWindowHint | Qt.Popup)

Уже не необходим implementat método focusOutEvent.

0
ответ дан 24.11.2019, 11:32
  • 1
    Проблема, - что, использовав Qt. Popup производит эффект тени, который я не могу удалять, не теряя действия close в clickear снаружи:/ – Christopher Vivar Vivar 20.01.2017, 15:54
  • 2
    Podrí схвати показывать изображение этого эффекта, так как я это не наблюдаю – eyllanesc 20.01.2017, 15:56
  • 3
  • 4
    Уважаемому уже удалось упорядочить эту проблему с click вне главного widget, сейчас одинокий мне не хватает точки, обнаруживать click в каком-то сыне или ' SimpleDialogItem'. я пытался с ' mouseReleaseEvent' проблема состоит в том, что он не обнаруживает у меня первичный click, но если я кликаю со второстепенной кнопкой (Право), если он обнаруживает, будьте перечитан. Какая-то идея как менять эту деталь? когда он будет закончен, я добавлю код, законченный для утилиты :) – Christopher Vivar Vivar 23.01.2017, 15:26
  • 5
    @ChristopherVivarVivar я только что ответил вопрос, стойте излишек, stackoverflow.com/questions/41798371/… , может быть, помог тебе. – eyllanesc 23.01.2017, 18:47

Уважаемые читатели, им захотело показать решение, что encontré в мою проблему.
Сначала, Â: как закрывать мой widget SimpleDialog для clickear вне?
Я Сделал одну pequeña modificaci¦n в конце widget, которая позволяет мне расширять сам и manegar вся Ваша площадь.

main = QVBoxLayout()
main.addWidget(...contenido...)

self.fullWidget = QWidget()
self.fullWidget.setLayout(main)
self.fullWidget.setStyleSheet("background-color: RGB(0,0,0,30)")

l = QHBoxLayout()
l.addWidget(self.fullWidget)

self.showFullScreen()
self.setLayout(l)

AsÃ,, - таким образом, я могу, на mouseReleaseEvent пишут, чтобы обнаруживать верхнюю площадь и когда заканчивать click , который закрывался бы.

def mouseReleaseEvent(self, QEvent):
    if QApplication.widgetAt(QEvent.pos()) == self.fullWidget:
        self.close()

Сейчас, как soluci¦n в проблему закрытия SimpleDialog, нажав на SimpleDialogItem это на писании метода mouseReleaseEvent для с QApplication находить отца и закрывать это

def mouseReleaseEvent(self, *args, **kwargs):
    for widget in QApplication.topLevelWidgets():
        if type(widget) == SimpleDialog:
            widget.close()
1
ответ дан 24.11.2019, 11:32