Quantcast
Channel: Preguntas activas con las etiquetas pyqt - Stack Overflow en español
Viewing all articles
Browse latest Browse all 77

Cómo cerrar un QDialog al precionar un componente dentro de él o al clickear fuera del dialog

$
0
0

Tengo estos dos archivos:

Uno es Dialog, el cual posee dos clases, SimpleDialog y SimpleDialogItem.
El problema que tengo que es que deseo que el SimpleDialog se cierre cuando haga click fuera de éste, o cuando se presione un componente de él (SimpleDialogItem).

El segundo archivo es test.py, el cual al testear el código, resulta que MainLayout es un QWidget.

Dialog.py

# coding=utf-8from PyQt4.QtCore import Qtfrom 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 sysfrom PyQt4.QtGui import QApplicationfrom PyQt4.QtGui import QHBoxLayoutfrom PyQt4.QtGui import QPushButton, QDialogfrom Dialog import SimpleDialog, SimpleDialogItemclass 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_())

El código no detecta focusOut en SimpleDialog. ¿Alguna solución?


Viewing all articles
Browse latest Browse all 77

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>