Найти - Пользователи
Полная версия: Вопрос по PyQt5. Не понимаю как работает программа
Начало » Python для новичков » Вопрос по PyQt5. Не понимаю как работает программа
1 2
Rodegast
> Говорю “создай два независимых окна”, этот создаёт иерархию окон. Теперь удали Dialog и вся твоя фигня посыпется, потому что остальные окна зависят от него.

Ну вот тебе 2 “независимых” окна. Прям как ты хочешь.
 import sys
import PySide.QtGui as QtGui
import PySide.QtCore as QtCore
 
class X1(QtGui.QMainWindow):
	def __init__(self):
		QtGui.QMainWindow.__init__(self)
		self.label = QtGui.QLabel(self)
		self.setCentralWidget(self.label)
 
	def setBaklan(self):
		self.label.setText(self.label.text()+u"Обломись ещё раз баклан!\n")
 
class X2(QtGui.QMainWindow):
	signal = QtCore.Signal()
	def __init__(self):
		QtGui.QMainWindow.__init__(self)
		self.knopka = QtGui.QPushButton(self)
		self.knopka.setText(u"Нажми меня")
		self.knopka.clicked.connect(self.signal)
 
if __name__ == '__main__':
	app = QtGui.QApplication(sys.argv)
	win1 = X1()
	win1.show()
	win2 = X2()
	win2.signal.connect(win1.setBaklan)
	win2.show()
	sys.exit(app.exec_())
py.user.next
Rodegast
Ну вот тебе 2 “независимых” окна.
И какое отношение сигнал из окна X2 имеет к окну X1? Чем обосновано нахождение сигнала внутри класса X2? Ты запутался, задёргался.

В приличной системе сообщений окно само должно посылать сообщение, если хочет что-то сообщить. Сообщение от окна посылается менеджеру сообщений, к которому подключены другие окна на прослушивание и тд и тп. Таким образом они могут реагировать на сообщения и не знать про наличие других окон в системе. Если выстроить высокую иерархию окон, то окно с самого низа иерархии может послать сообщение менеджеру сообщений, которое сможет услышать окно на самой вершине иерархии. При этом эти окна вообще друг про друга не знают. А если они друг про друга не знают, то и про сигналы внутри них они точно так же не знают. Ты просто не сможешь сделать рефакторинг, поменять расположение окон, потому что у тебя будет куча лишних связей между ними. И в итоге у тебя программа просто застынет и ты не будешь её развивать, потому что каждое развитие потребует её полного переписывания (что, естественно, ты делать не будешь).

Из той истории, когда ты докопался до его (zetcode Jan Bodnar) окна в виде QWidget. Почему он так сделал, а не через QMainWindow. Ты утверждал, что это ошибка, потому что он не знает нифига. Это не ошибка. Это сделано потому, что каждый его пример можно использовать для сборки целого приложения, у которого одно QMainWindow и куча виджетов, встроенных в это главное окно. У него всё сделано так, что виджеты в любой момент можно встраивать в любые другие виджеты. Поэтому там нет этого QMainWindow почти нигде. Он просто видит это всё заранее, поэтому он так и пишет, что тебе непонятно ничего, так как ты привык только туториалы просматривать, а не реальные приложения.

И ещё я тебе скажу: ты не можешь делать два QMainWindow в одном приложении, потому что QMainWindow - это кучка виджетов (меню, централка и статусная строка), собранных в одном окне, это шаблон такой, чтобы не делать это каждый раз, когда пишется приложение, у которого есть главное окно.
Rodegast
> И какое отношение сигнал из окна X2 имеет к окну X1? Чем обосновано нахождение сигнала внутри класса X2?

Вот как раз с этим всё очень просто. Источником сигнала является окно X2, по этому и сигнал определён как его атрибут. X1 никакого отношения к этому не имеет, мы просто подписываем его на событие из X2.

> ты не можешь делать два QMainWindow в одном приложении, потому что QMainWindow - это кучка виджетов (меню, централка и статусная строка), собранных в одном окне, это шаблон такой

Ну да QMainWindow это заготовка. И что? Конечно приложение с 2-я главными окнами смотрится странно, но ты же сам этого захотел.

> когда ты докопался до его (zetcode Jan Bodnar) окна в виде QWidget. Почему он так сделал, а не через QMainWindow.

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

> Он просто видит это всё заранее, поэтому он так и пишет
py.user.next
Rodegast
Источником сигнала является окно X2, по этому и сигнал определён как его атрибут.
Источником сигнала (и в сигнале даже это где-то записывается внутри объекта) является тот, кто вызвал emit() у сигнала (явно или неявно). Потом это можно через вызов sender() узнавать на том конце, где сигнал получен. При этом сигнал не должен создаваться где-то внутри объекта, посылающего его. А добавление сигнала в интерфейс объекта делается тогда, когда от объекта нужно получать информацию о состоянии. Кнопка, например, может послать сигнал, что её нажали. То есть она была в ненажатом состоянии, а потом она стала нажатой - состояние изменилось (из множества состояний кнопки). То же самое таймер: у него есть сигнал свой, который сообщает о переходе объекта в состояние завершённости (timeout). А твой сигнал никакого отношения к множеству состояний окна не имеет. Поэтому оно и выглядит так безграмотно - как будто в интерфейсе окна какая-то левая ручка торчит. Это как во входную дверь встроить кран для наливания воды, который даже к воде не подключён. А если его и подключить к воде, то это всё равно бредовым и бесполезным останется. Он не должен там быть вообще. Мало ли, что он там работает и вода из него льётся, с кружкой туда всё равно никто бегать не будет.
Rodegast
> А твой сигнал никакого отношения к множеству состояний окна не имеет.

Вполне себе имеет. Множество состояний окна это сумма состояний всех его виджетов, knopka не сама по себе существует, а находится внутри окна, по этому изменение её состояния можно считать изменением состояния всего окна.
salvoronis
Извините, что лезу в спор, но не подскажете что-то вроде справочника по pyqt5? Или qt под c++ справочники тоже подойдут?
py.user.next
salvoronis
Или qt под c++ справочники тоже подойдут?
Вообще, надо уметь применять основной справочник по Qt/C++, потому что не всегда справочник по pyqt успевает за версиями Qt. Но для этого может понадобиться и в C++ разбираться немного, потому что иногда надо проверять на практике примеры из документации.
salvoronis
Спасибо за ответ!
А чтобы сделать хоть какой-то дизайн можно использовать css? Или что-то еще?
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