Найти - Пользователи
Полная версия: PyQt4 и правильное сопровождение проекта
Начало » Python для новичков » PyQt4 и правильное сопровождение проекта
1
kzoi_py
Всем доброго времени суток. Публикуюсь сюда т.к. решение видимо совсем простое )) В общем содзадим кютдесинджером две формы на которых разные интерфейсы. К примеру на первой форме одна кнопка, а на второй лист виджет. Подскажите как сделать так, чтоб при нажатии на кнопку первой формы открывалась вторая )))) вот наработки
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_())
За ранее всем спасибо =)
ZZZ
Это называется архитектурой.
Неправилен сам подход. У тебя главным объектом приложения является форма (от QWidget), а это плохо согласуется с MVC.

kzoi_py
from PyQt4.QtGui import *
from PyQt4.QtCore import *
Не используй никогда.
kzoi_py
подскадите плиз почитать чего рускоязычное по корректному построению архитектуры. Просто самодеятельность приводит к всяким ошибкам ) простые приложения кодил по шаблону главного файла приведённого выше а теперь безсилен (( вот что получилось
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
bazooka
MyForm нужно наследовать от QWidget

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

from PyQt4 import QtGui
from PyQt4 import QtCore
и всем хорошо
kzoi_py
а так корректно кодить? :)
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_())
И ещё такой вопрос. Я породил два окна. Как сделать так, чтоб первая форма не могла закрыться пока вторую не закроем?
ZZZ
kzoi_py
подскадите плиз почитать чего рускоязычное по корректному построению архитектуры. Просто самодеятельность приводит к всяким ошибкам )
Я приходил к этому методом проб и ошибок.
Почитай про MVC, попробуй разные варианты… Запомни – логика программы не должна зависеть от виджетов. Т.е. рожа, это рожа, а логика, это логика. Притом, для логики классы от QObject не нужны… Хотя да, я когда-то использовал контроллер именно от QObject, так как было удобно использовать коннекты (кстати, почитай документацию, ты используешь старый стиль, что тоже не хорошо), а сейчас понимаю, что с этой задачей куда лучше справятся хендлеры.

kzoi_py
from PyQt4 import QtGui as qg
from PyQt4 import QtCore as qc
Тоже криво. bazooka правильно говорит.
bazooka
http://doc.qt.nokia.com/4.6/qwidget.html#closeEvent
pasaranax
from PyQt4.QtGui import *
from PyQt4.QtCore import *
Не вижу в этом ничего плохого. Qt на С++ разрабатывался изначально без пространств имен, и все классы имеют префикс Q, так что вполне нормально и читается и никакие имена не перекроются.
kzoi_py
ещё случай интересный =) не знаю что и думать
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 и указал его функцию для переопределения. В итоге событие отвечающее за “не закрытие” главного окна всегда принимает решение что второе окно не существует, а следовательно первое закрывается. Подскажите плиз =) за ранее спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB