Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 21, 2008 09:12:07

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов


# класс формы

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)

Офлайн

#2 Янв. 21, 2008 09:49:12

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Супер, спасибо большое!!! А можно еще вопрос. Скажем, я вешаю вызов функции при нажатии кнопки следующим кодом:
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)

Офлайн

#3 Янв. 22, 2008 21:02:01

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Если необходим полиморфизм, то вот это должно работать и по нажатию кнопки и при вызове из программы со своими параметрами:

def toolButtonClicked(self, customParam = None):


Возможно я вас не так понял, поэтому ещё один типс:
Если нужно в функции узнать, кто её вызвал (кто послал сигнал), то self.sender() в теле функции вернёт тот элемент управления (кнопку).

def toolButtonClicked(self):
button = self.sender()



Офлайн

#4 Янв. 23, 2008 10:03:46

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Блин, я тут протормозил, извините, в предыдущем примере было то, что мне нужно: button = self.sender(). Спасибо, что еще раз показали :)



Офлайн

#5 Янв. 30, 2008 18:22:41

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Люди, а можно вопрос: пытаюсь разобрать, как выводить диалоговые окна. Например, при нажатии кнопки “настройка”, чтобы выскакивало окно, в котором я выведу окно созданное с помощью QtDesigner. Просто объяснить, как диалоговые окна выводятся, а то не совсем понятно. Заранее спасибо.



Отредактировано (Янв. 31, 2008 09:08:43)

Офлайн

#6 Янв. 30, 2008 19:56:34

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

GoTo: C:\Program Files\PyQt4\examples\dialogs
Мне не в падлу ответить, но толку от этого для вас будет мало.



Офлайн

#7 Янв. 31, 2008 12:25:56

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

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)

Офлайн

#8 Янв. 31, 2008 13:03:02

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

Ваш вариант:


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’



Офлайн

#9 Янв. 31, 2008 14:26:29

well
От:
Зарегистрирован: 2006-11-20
Сообщения: 163
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

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’
Понял, спасибо большое за сравнение :). На то оно и зовется, видать, Десигнером, что не все может, но удобно :)



Офлайн

#10 Фев. 13, 2008 11:22:12

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt - пару вопросов

well
Всем привет. У меня вопрос по поводу того, как лучше повесить какую-то функцию на кнопку. То есть, если я получал сигнал нажатия кнопки, то раньше я просто “вешал на него” любую функцию. Но тут стал вопрос, когда выполнение функции занимает каке-то время и она пишет лог в textBrowser по ходу выпонения. При обычном “вешании” окно зависает и ждет пока не выполнится функция. Я пока начал пользоваться потоками через threading, но может есть какое-то более рациональное решение?
Хороший пример по этому вопросу:
http://www.diotavelli.net/PyQtWiki/Threading%2C_Signals_and_Slots



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version