Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 3, 2009 23:33:42

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

Два нубских вопроса по PyQt4

pasaranax сори, перепутал, модифицировал я всё же твой пример. Как делать окно из QWidget далее по тексту и в моём примере.

gmorgunov Ну-ну:) Классовая иерархия - это просто свойство наследования из ООП и ничего больше, не придумывайте лишнего. А вот сейчас пойдут факты. В Qt все объекты (QObject) могут иметь много детей и одного родителя. Это же касается и виджетов и окон. В чём разница между виджетом и окном? Почти никакой, спасибо за это скажем тролям, они всё прекрасно унифицировали. На деле, чтобы виджет стал окном, надо просто чтобы у него небыло родителя (parent-а), а чтобы он стал дочерним окном, надо ему установить соответствующий флаг (Qt.Window или что-то другое, но не Qt.Widget), parent-ом тут должно быть родительское окно. Почему же с QMainWindow работает, а с другими виджетами не работает? Да потому, что QMainWindow в любом случае сам себе устанавливает флаг Qt.Window. QDialog ставит себе флаг Qt.Dialog соответственно. Теперь о блокировках. Как было уже сказано, блокируются только родительские окна при Qt.WindowModal, при Qt.ApplicationModal блокируются все окна приложения. И ещё, модальность надо устанавливать до показа окна, иначе не сработает.

Мой пруф, специально для не верящего на слово gmorgunov-а:)

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Window(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
self.button = QPushButton(self)
self.button.clicked.connect(self.add)

def add(self):
self.modal = QWidget(self) # устанавливаем parent-а для дочернего окна
self.modal.setWindowFlags(Qt.Window) # устанавливаем флаг окна
self.modal.setFixedSize(100, 100) # фиксированный размер
self.modal.setWindowModality(Qt.WindowModal) # модальность относительно родительского окна
self.modal.show() # показываем дочернее окно

if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
window.resize(200, 50)
sys.exit(app.exec_())



Офлайн

#2 Ноя. 4, 2009 08:41:01

gmorgunov
От:
Зарегистрирован: 2008-10-15
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

Два нубских вопроса по PyQt4

poltergeist
За пример - спасибо. Хороший пример - лучшее доказательство. :)



Офлайн

#3 Ноя. 4, 2009 14:44:00

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

Два нубских вопроса по PyQt4

poltergeist
Спасибо большое! Не возражаете, если ваш пример в статью для хабра включу? Планирую рассказать о проблемах, с которыми сам столкнулся, пока писал свое Qt-приложение.



Офлайн

#4 Ноя. 4, 2009 15:06:00

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

Два нубских вопроса по PyQt4

Enchantner Да без проблем



Офлайн

#5 Ноя. 5, 2009 20:24:12

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

Два нубских вопроса по PyQt4

Еще один вопрос - как перенаправить вывод из консоли в виджет на форме? Я помню, что для вывода в лог нужно открывать файл в режиме “a+” для автоматического дописывания в конец:

sys.stdout = open('log.txt', 'a+')
sys.stderr = open('log.txt', 'a+')
А как грамотно сделать это с виджетом? И какой лучше использовать?



Отредактировано (Ноя. 5, 2009 20:25:26)

Офлайн

#6 Ноя. 5, 2009 21:02:47

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

Два нубских вопроса по PyQt4

Надо сделать file-like объект, т.е. любой объект с методом write() в данном случае и подсунуть один такой объект в sys.stdout, а другой в sys.stderr. В методе write(text) делаешь textedit.append(text) и всё. QTextEdit пусть лучше будет readonly.

З.Ы. Создал бы лучше новый вопрос, зачем тут дописывать то, что не по теме первого поста.



Отредактировано (Ноя. 5, 2009 21:05:54)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version