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?