Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2010 19:34:53

kzoi_py
От:
Зарегистрирован: 2009-02-01
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 и правильное сопровождение проекта

Всем доброго времени суток. Публикуюсь сюда т.к. решение видимо совсем простое )) В общем содзадим кютдесинджером две формы на которых разные интерфейсы. К примеру на первой форме одна кнопка, а на второй лист виджет. Подскажите как сделать так, чтоб при нажатии на кнопку первой формы открывалась вторая )))) вот наработки
i1.py

from PyQt4 import QtCore, QtGui

class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtGui.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(40, 50, 75, 24))
self.pushButton.setObjectName("pushButton")

self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)

def retranslateUi(self, Form):
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("Form", "PushButton", None, QtGui.QApplication.UnicodeUTF8))
i2.py
from PyQt4 import QtCore, QtGui

class Ui_Form2(object):
def setupUi(self, Form):
Form2.setObjectName("Form2")
Form2.setGeometry(QtCore.QRect(0, 0, 400, 300))
self.listView = QtGui.QListView(Form2)
self.listView.setGeometry(QtCore.QRect(70, 30, 256, 192))
self.listView.setObjectName("listView")

# self.retranslateUi2(Form2)
QtCore.QMetaObject.connectSlotsByName(Form2)

def retranslateUi2(self, Form2):
Form2.setWindowTitle(QtGui.QApplication.translate("Form2", "Form2", None, QtGui.QApplication.UnicodeUTF8))
запускающий файл
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import i1 as intr, i2 as intr2


class MyForm(QMainWindow, intr.Ui_Form):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setupUi(self)
self.connect(self.pushButton, SIGNAL("clicked()"), self.sota)


def sota(self):
self.class2 = intr2.Ui_Form2()
#QWidget.__init__(QWidget, None)
self.class2.setupUi(self.class2)


if __name__ == "__main__":
app = QApplication(sys.argv)
myapp = MyForm()
myapp.show()
sys.exit(app.exec_())
За ранее всем спасибо =)



Офлайн

#2 Фев. 4, 2010 20:12:40

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

PyQt4 и правильное сопровождение проекта

Это называется архитектурой.
Неправилен сам подход. У тебя главным объектом приложения является форма (от QWidget), а это плохо согласуется с MVC.

kzoi_py
from PyQt4.QtGui import *
from PyQt4.QtCore import *
Не используй никогда.



Офлайн

#3 Фев. 4, 2010 22:15:59

kzoi_py
От:
Зарегистрирован: 2009-02-01
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 и правильное сопровождение проекта

подскадите плиз почитать чего рускоязычное по корректному построению архитектуры. Просто самодеятельность приводит к всяким ошибкам ) простые приложения кодил по шаблону главного файла приведённого выше а теперь безсилен (( вот что получилось

import sys
from PyQt4 import QtGui as qg
from PyQt4 import QtCore as qc
import i1 , i2


class MyForm(): #, intr.Ui_Form):
def __init__(self):
f1 = i1.Ui_Form()
qg.QWidget.__init__(self, None)
f1.setupUi(self)


if __name__ == "__main__":
app = qg.QApplication(sys.argv)
myapp = MyForm()
myapp.show()
sys.exit(app.exec_())
требует некий sip.wrapper при исполнении конструктора QWidget



Офлайн

#4 Фев. 5, 2010 00:57:05

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 и правильное сопровождение проекта

MyForm нужно наследовать от QWidget

и зачем импорты с другими именами? 3-4 буквы погоды не сделают а читаемость падает, темболее q и g еще и похожи

from PyQt4 import QtGui
from PyQt4 import QtCore
и всем хорошо



Офлайн

#5 Фев. 5, 2010 09:56:51

kzoi_py
От:
Зарегистрирован: 2009-02-01
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 и правильное сопровождение проекта

а так корректно кодить? :)

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
import i1 , i2

class MyForm():
window = 0
window2 = 0
def __init__(self):
f1 = i1.Ui_Form()
self.window = QtGui.QWidget()
f1.setupUi(self.window)
f2 = i2.Ui_Form2()
self.window2 = QtGui.QWidget()
f2.setupUi(self.window2)
QtCore.QObject.connect(f1.pushButton, QtCore.SIGNAL("clicked()"), self.window2.show)

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = MyForm()
myapp.window.show()
sys.exit(app.exec_())
И ещё такой вопрос. Я породил два окна. Как сделать так, чтоб первая форма не могла закрыться пока вторую не закроем?



Отредактировано (Фев. 5, 2010 09:58:57)

Офлайн

#6 Фев. 5, 2010 10:17:14

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

PyQt4 и правильное сопровождение проекта

kzoi_py
подскадите плиз почитать чего рускоязычное по корректному построению архитектуры. Просто самодеятельность приводит к всяким ошибкам )
Я приходил к этому методом проб и ошибок.
Почитай про MVC, попробуй разные варианты… Запомни – логика программы не должна зависеть от виджетов. Т.е. рожа, это рожа, а логика, это логика. Притом, для логики классы от QObject не нужны… Хотя да, я когда-то использовал контроллер именно от QObject, так как было удобно использовать коннекты (кстати, почитай документацию, ты используешь старый стиль, что тоже не хорошо), а сейчас понимаю, что с этой задачей куда лучше справятся хендлеры.

kzoi_py
from PyQt4 import QtGui as qg
from PyQt4 import QtCore as qc
Тоже криво. bazooka правильно говорит.



Офлайн

#7 Фев. 5, 2010 10:28:27

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 и правильное сопровождение проекта

Офлайн

#8 Фев. 5, 2010 13:34:04

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 и правильное сопровождение проекта

from PyQt4.QtGui import *
from PyQt4.QtCore import *
Не вижу в этом ничего плохого. Qt на С++ разрабатывался изначально без пространств имен, и все классы имеют префикс Q, так что вполне нормально и читается и никакие имена не перекроются.



Офлайн

#9 Фев. 5, 2010 15:38:16

kzoi_py
От:
Зарегистрирован: 2009-02-01
Сообщения: 74
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4 и правильное сопровождение проекта

ещё случай интересный =) не знаю что и думать

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
import i1 , i2, operator

class MyForm():
dictionary_class = {}
window = 0
window2 = 0
def __init__(self):
f1 = i1.Ui_Form()
self.window = QtGui.QMainWindow()
f1.setupUi(self.window)
self.dictionary_class['window'] = 0
f2 = i2.Ui_Form2()
self.window2 = QtGui.QWidget()
f2.setupUi(self.window2)
self.dictionary_class['window2'] = 0
QtCore.QObject.connect(f1.pushButton, QtCore.SIGNAL("clicked()"), self.window2.show)
self.window.closeEvent = self.wclose1 # take event close
self.window2.showEvent == operator.__setitem__(self.dictionary_class, "window2", 1) #self.wshow
self.window2.closeEvent == operator.__setitem__(self.dictionary_class, "window2", 0) #self.w2close

def wclose1(self, event):
if self.dictionary_class["window2"] > 0:
event.ignore()
else:
event.accept()

# def wshow(self, event):
# self.dictionary_class["window2"] = 1

# def w2close(self,event):
# self.dictionary_class["window2"] = 0

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = MyForm()
operator.setitem(myapp.dictionary_class, "window", 1)
myapp.window.show()
sys.exit(app.exec_())
в общем я переопределил события и всё работает так как мне нужно, но захотелось сократить код. Добавил модуль operator и указал его функцию для переопределения. В итоге событие отвечающее за “не закрытие” главного окна всегда принимает решение что второе окно не существует, а следовательно первое закрывается. Подскажите плиз =) за ранее спасибо



Отредактировано (Фев. 5, 2010 15:40:00)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version