Форум сайта python.su
# класс формы
def __init__(self):
…
control = QtGui.QPushButton(DEFAULT_UNSET_DATE)
self.connect(control, QtCore.SIGNAL('clicked()'), self.getDate)
…
def getDate(self):
button = self.sender()
date = CalendarDialog.getDate(button)
if date: button.setText(date)
…………………………
#И ещё класс из моего проекта:
##—————————————————————————–
##
class CalendarDialog(QtGui.QDialog):
‘'’
‘'’
def __init__(self, control):
super(CalendarDialog, self).__init__()
#
layout = QtGui.QVBoxLayout(self)
layout.setMargin(3)
self.setWindowFlags(QtCore.Qt.Popup);
self.calendar = QtGui.QCalendarWidget()
layout.addWidget(self.calendar)
button = QtGui.QPushButton(u'OK')
layout.addWidget(button)
#
self.connect(button, QtCore.SIGNAL('clicked()'), self.accept)
#
self.place(control)
##
##
##————————————————————————-
##
def place(self, control):
pos = control.mapToGlobal(control.mapFromParent(control.pos()))
pos.setY(pos.y() + control.height())
pos.setX(pos.x() - 206 + control.width())
self.move(pos)
##
##
##————————————————————————-
## if you want modal dialog, uncomment this
##
#def closeEvent(self, event): event.ignore()
##
##
##————————————————————————-
##
def exec_(self):
if QtGui.QDialog.exec_(self):
return unicode(self.calendar.selectedDate().toString('dd.MM.yyyy'))
##
##
##————————————————————————-
##
@staticmethod
def getDate(control):
dialog = CalendarDialog(control)
#
return dialog.exec_()
##
##
##————————————————————————-
Result:
Отредактировано (Фев. 8, 2008 14:21:59)
Офлайн
Супер, спасибо большое!!! А можно еще вопрос. Скажем, я вешаю вызов функции при нажатии кнопки следующим кодом:
class faceForm (QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, None)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.connect (self.ui.toolButton,
QtCore.SIGNAL (“clicked()”),
self.toolButtonClicked)
…
def toolButtonClicked (self):
…
А если мне надо передать функции toolButtonClicked какие-то параметры, то как это сделать?
Отредактировано (Янв. 21, 2008 19:48:15)
Офлайн
Если необходим полиморфизм, то вот это должно работать и по нажатию кнопки и при вызове из программы со своими параметрами:
def toolButtonClicked(self, customParam = None):
…
Возможно я вас не так понял, поэтому ещё один типс:
Если нужно в функции узнать, кто её вызвал (кто послал сигнал), то self.sender() в теле функции вернёт тот элемент управления (кнопку).
def toolButtonClicked(self):
button = self.sender()
…
Офлайн
Блин, я тут протормозил, извините, в предыдущем примере было то, что мне нужно: button = self.sender(). Спасибо, что еще раз показали :)
Офлайн
Люди, а можно вопрос: пытаюсь разобрать, как выводить диалоговые окна. Например, при нажатии кнопки “настройка”, чтобы выскакивало окно, в котором я выведу окно созданное с помощью QtDesigner. Просто объяснить, как диалоговые окна выводятся, а то не совсем понятно. Заранее спасибо.
Отредактировано (Янв. 31, 2008 09:08:43)
Офлайн
GoTo: C:\Program Files\PyQt4\examples\dialogs
Мне не в падлу ответить, но толку от этого для вас будет мало.
Офлайн
poltergeistПо этим примерам я немного понял, как диалоги выводить, а вот как вывести диалог, если мне его Десигнер сгенерил и он лежит в отдельном файле?. Вот сгенеренный код:
GoTo: C:\Program Files\PyQt4\examples\dialogs
Мне не в падлу ответить, но толку от этого для вас будет мало.
from PyQt4 import QtCore, QtGui
class Ui_dialog(object):
def setupUi(self, dialog):
dialog.setObjectName("dialog")
dialog.resize(QtCore.QSize(QtCore.QRect(0,0,520,394).size()).expandedTo(dialog.minimumSizeHint()))
self.buttonBox = QtGui.QDialogButtonBox(dialog)
self.buttonBox.setGeometry(QtCore.QRect(340,360,171,32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.listWidget = QtGui.QListWidget(dialog)
self.listWidget.setGeometry(QtCore.QRect(0,0,191,391))
font = QtGui.QFont()
font.setPointSize(12)
self.listWidget.setFont(font)
self.listWidget.setObjectName("listWidget")
self.groupBox = QtGui.QGroupBox(dialog)
self.groupBox.setGeometry(QtCore.QRect(200,0,311,341))
self.groupBox.setObjectName("groupBox")
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("accepted()"),dialog.accept)
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL("rejected()"),dialog.reject)
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentRowChanged(int)"),self.groupBox.repaint)
QtCore.QMetaObject.connectSlotsByName(dialog)
Отредактировано (Март 9, 2009 21:30:23)
Офлайн
Ваш вариант:
from PyQt4 import QtCore, QtGui
class Ui_dialog(object):
def setupUi(self, dialog):
dialog.setObjectName(“dialog”)
dialog.resize(QtCore.QSize(QtCore.QRect(0,0,520,394).size()).expandedTo(dialog.minimumSizeHint()))
self.buttonBox = QtGui.QDialogButtonBox(dialog)
self.buttonBox.setGeometry(QtCore.QRect(340,360,171,32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(“buttonBox”)
self.listWidget = QtGui.QListWidget(dialog)
self.listWidget.setGeometry(QtCore.QRect(0,0,191,391))
font = QtGui.QFont()
font.setPointSize(12)
self.listWidget.setFont(font)
self.listWidget.setObjectName(“listWidget”)
self.groupBox = QtGui.QGroupBox(dialog)
self.groupBox.setGeometry(QtCore.QRect(200,0,311,341))
self.groupBox.setObjectName(“groupBox”)
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL(“accepted()”),dialog.accept)
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL(“rejected()”),dialog.reject)
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL(“currentRowChanged(int)”),self.groupBox.repaint)
QtCore.QMetaObject.connectSlotsByName(dialog)
app = QtGui.QApplication()
dialog = QtGui.QDialog()
Ui_dialog().setupUi(dialog)
dialog.exec_()
Мой, более человечный вариант:
from PyQt4 import QtCore, QtGui
class Ui_dialog(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
#
self.setupUi()
def setupUi(self):
self.setObjectName(“dialog”)
self.resize(QtCore.QSize(QtCore.QRect(0,0,520,394).size()).expandedTo(self.minimumSizeHint()))
self.buttonBox = QtGui.QDialogButtonBox(self)
self.buttonBox.setGeometry(QtCore.QRect(340,360,171,32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(“buttonBox”)
self.listWidget = QtGui.QListWidget(self)
self.listWidget.setGeometry(QtCore.QRect(0,0,191,391))
font = QtGui.QFont()
font.setPointSize(12)
self.listWidget.setFont(font)
self.listWidget.setObjectName(“listWidget”)
self.groupBox = QtGui.QGroupBox(self)
self.groupBox.setGeometry(QtCore.QRect(200,0,311,341))
self.groupBox.setObjectName(“groupBox”)
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL(“accepted()”),self.accept)
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL(“rejected()”),self.reject)
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL(“currentRowChanged(int)”),self.groupBox.repaint)
QtCore.QMetaObject.connectSlotsByName(self)
app = QtGui.QApplication()
dialog = Ui_dialog()
result = dialog.exec_()
if result: print ‘OK Button pressed’
else: print ‘Cancel Button pressed’
Офлайн
poltergeistПонял, спасибо большое за сравнение :). На то оно и зовется, видать, Десигнером, что не все может, но удобно :)
Ваш вариант:
from PyQt4 import QtCore, QtGui
class Ui_dialog(object):
def setupUi(self, dialog):
dialog.setObjectName(“dialog”)
dialog.resize(QtCore.QSize(QtCore.QRect(0,0,520,394).size()).expandedTo(dialog.minimumSizeHint()))
self.buttonBox = QtGui.QDialogButtonBox(dialog)
self.buttonBox.setGeometry(QtCore.QRect(340,360,171,32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(“buttonBox”)
self.listWidget = QtGui.QListWidget(dialog)
self.listWidget.setGeometry(QtCore.QRect(0,0,191,391))
font = QtGui.QFont()
font.setPointSize(12)
self.listWidget.setFont(font)
self.listWidget.setObjectName(“listWidget”)
self.groupBox = QtGui.QGroupBox(dialog)
self.groupBox.setGeometry(QtCore.QRect(200,0,311,341))
self.groupBox.setObjectName(“groupBox”)
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL(“accepted()”),dialog.accept)
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL(“rejected()”),dialog.reject)
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL(“currentRowChanged(int)”),self.groupBox.repaint)
QtCore.QMetaObject.connectSlotsByName(dialog)
app = QtGui.QApplication()
dialog = QtGui.QDialog()
Ui_dialog().setupUi(dialog)
dialog.exec_()
Мой, более человечный вариант:
from PyQt4 import QtCore, QtGui
class Ui_dialog(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
#
self.setupUi()
def setupUi(self):
self.setObjectName(“dialog”)
self.resize(QtCore.QSize(QtCore.QRect(0,0,520,394).size()).expandedTo(self.minimumSizeHint()))
self.buttonBox = QtGui.QDialogButtonBox(self)
self.buttonBox.setGeometry(QtCore.QRect(340,360,171,32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.NoButton|QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(“buttonBox”)
self.listWidget = QtGui.QListWidget(self)
self.listWidget.setGeometry(QtCore.QRect(0,0,191,391))
font = QtGui.QFont()
font.setPointSize(12)
self.listWidget.setFont(font)
self.listWidget.setObjectName(“listWidget”)
self.groupBox = QtGui.QGroupBox(self)
self.groupBox.setGeometry(QtCore.QRect(200,0,311,341))
self.groupBox.setObjectName(“groupBox”)
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL(“accepted()”),self.accept)
QtCore.QObject.connect(self.buttonBox,QtCore.SIGNAL(“rejected()”),self.reject)
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL(“currentRowChanged(int)”),self.groupBox.repaint)
QtCore.QMetaObject.connectSlotsByName(self)
app = QtGui.QApplication()
dialog = Ui_dialog()
result = dialog.exec_()
if result: print ‘OK Button pressed’
else: print ‘Cancel Button pressed’
Офлайн
wellХороший пример по этому вопросу:
Всем привет. У меня вопрос по поводу того, как лучше повесить какую-то функцию на кнопку. То есть, если я получал сигнал нажатия кнопки, то раньше я просто “вешал на него” любую функцию. Но тут стал вопрос, когда выполнение функции занимает каке-то время и она пишет лог в textBrowser по ходу выпонения. При обычном “вешании” окно зависает и ждет пока не выполнится функция. Я пока начал пользоваться потоками через threading, но может есть какое-то более рациональное решение?
Офлайн