Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 9, 2017 10:59:47

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

> Говорю “создай два независимых окна”, этот создаёт иерархию окон. Теперь удали 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_())



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#2 Окт. 9, 2017 12:45:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

Rodegast
Ну вот тебе 2 “независимых” окна.
И какое отношение сигнал из окна X2 имеет к окну X1? Чем обосновано нахождение сигнала внутри класса X2? Ты запутался, задёргался.

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

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

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



Отредактировано py.user.next (Окт. 9, 2017 12:55:21)

Офлайн

#3 Окт. 9, 2017 14:45:48

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

> И какое отношение сигнал из окна X2 имеет к окну X1? Чем обосновано нахождение сигнала внутри класса X2?

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

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

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

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

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

> Он просто видит это всё заранее, поэтому он так и пишет



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Окт. 10, 2017 03:47:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

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



Отредактировано py.user.next (Окт. 10, 2017 03:49:39)

Офлайн

#5 Окт. 10, 2017 11:10:59

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

> А твой сигнал никакого отношения к множеству состояний окна не имеет.

Вполне себе имеет. Множество состояний окна это сумма состояний всех его виджетов, knopka не сама по себе существует, а находится внутри окна, по этому изменение её состояния можно считать изменением состояния всего окна.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Окт. 10, 2017 14:44:19

salvoronis
Зарегистрирован: 2017-10-05
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

Извините, что лезу в спор, но не подскажете что-то вроде справочника по pyqt5? Или qt под c++ справочники тоже подойдут?

Офлайн

#7 Окт. 10, 2017 14:59:54

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

salvoronis
Или qt под c++ справочники тоже подойдут?
Вообще, надо уметь применять основной справочник по Qt/C++, потому что не всегда справочник по pyqt успевает за версиями Qt. Но для этого может понадобиться и в C++ разбираться немного, потому что иногда надо проверять на практике примеры из документации.



Офлайн

#8 Окт. 10, 2017 16:30:04

salvoronis
Зарегистрирован: 2017-10-05
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

Спасибо за ответ!
А чтобы сделать хоть какой-то дизайн можно использовать css? Или что-то еще?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version