Форум сайта python.su
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_())
Офлайн
poltergeist
За пример - спасибо. Хороший пример - лучшее доказательство. :)
Офлайн
poltergeist
Спасибо большое! Не возражаете, если ваш пример в статью для хабра включу? Планирую рассказать о проблемах, с которыми сам столкнулся, пока писал свое Qt-приложение.
Офлайн
Enchantner Да без проблем
Офлайн
Еще один вопрос - как перенаправить вывод из консоли в виджет на форме? Я помню, что для вывода в лог нужно открывать файл в режиме “a+” для автоматического дописывания в конец:
sys.stdout = open('log.txt', 'a+')
sys.stderr = open('log.txt', 'a+')
Отредактировано (Ноя. 5, 2009 20:25:26)
Офлайн
Надо сделать file-like объект, т.е. любой объект с методом write() в данном случае и подсунуть один такой объект в sys.stdout, а другой в sys.stderr. В методе write(text) делаешь textedit.append(text) и всё. QTextEdit пусть лучше будет readonly.
З.Ы. Создал бы лучше новый вопрос, зачем тут дописывать то, что не по теме первого поста.
Отредактировано (Ноя. 5, 2009 21:05:54)
Офлайн