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_())