Форум сайта python.su
Первый: Как сделать родительское окно полностью неактивным (не принимающим ввод от пользователя и не дающим переключить себя на топлевел) при вызове дочернего?
Второй: Как запретить изменение размера для окна?
Отредактировано (Ноя. 2, 2009 20:02:42)
Офлайн
1)вроде никак
но можно сделать его setDisabled(True)
2) setFixedSize
Офлайн
Enchantner Тебе похоже надо просто сделать модальный диалог
Офлайн
1) widget.setWindowModality(Qt.ApplicationModal) - это блочит все приложение, еще есть параметр Qt.WindowModal, который блочит только родительское окно и Qt.NonModal, который ничего не блочит и является умолчательным.
Отредактировано (Ноя. 2, 2009 23:54:20)
Офлайн
pasaranax
У меня родительское окно типа QMainWindow, а дочернее - QWidget. Твой пример запускается без ошибок, но не работает :) Или я что-то не так делаю…
villager
насчет setFixedSize спасибо большое :)
Отредактировано (Ноя. 3, 2009 00:47:36)
Офлайн
EnchantnerЯ пробовал с родителем QWidget и ребенком QDialog. Как ты QWidget окном сделал, можешь кусок кода показать? Может применяешь модальность не к тому?
У меня родительское окно типа QMainWindow, а дочернее - QWidget. Твой пример запускается без ошибок, но не работает smile Или я что-то не так делаю…
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class Window(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.button = QPushButton(self)
self.button.clicked.connect(self.add)
def add(self):
modal = QDialog(self)
modal.setWindowModality(Qt.ApplicationModal)
modal.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
window.resize(200, 50)
sys.exit(app.exec_())
Отредактировано (Ноя. 3, 2009 01:57:09)
Офлайн
villagerсорри…ввел в заблуждение…
1)вроде никак
но можно сделать его setDisabled(True)
Офлайн
Привет. Как у вас сделано: главное окно - это QMainWindow, дочернее - QWidget, работать не будет, потому что( из ассистанта):
A modal window is one that blocks input to other windows. Note that windows that are children of a modal window are not blocked.QMainWindow - children QWidget.
#!/usr/bin/env python2.6
# coding: utf-8
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MainWindow(QWidget):
def __init__(self):
QWidget.__init__(self)
# главное окно - QWidget
self.setWindowTitle("MainWindow")
self.resize(300,100)
# дочерний widget теперь - это QMainWindow
self.modal = QMainWindow(self)
self.modal.setWindowTitle("Widget")
self.modal.show()
self.pushButton=QPushButton(self)
self.connect(self.pushButton, SIGNAL("clicked()"), self.set_modal)
def set_modal(self):
self.modal.hide()
self.modal.setWindowModality(Qt.WindowModal)
self.modal.show()
if __name__=='__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Офлайн
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.modal.setFixedSize(100, 100)
self.modal.setWindowModality(Qt.ApplicationModal)
self.modal.show()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
window.resize(200, 50)
sys.exit(app.exec_())
Офлайн
poltergeist
Рад бы ошибится, да факты не позволяют. :) Почему мой пример работает? А наоборот нет? Причем работает точно так, как ваш( если закоментировать #self.modal.show() в конструкторе. По-моему дело именно в классовом родстве (иерархии Qt). Пример с Qt.ApplicationModal - не совсем корректен. Тут блокируется окно верхнего уровня в приложении . Вы приведите пример с Qt.WindowModal?
Вывод: потомок в приложении может заблокировать родителя в приложении, если он стоит ниже в иерархии Qt.
( установив у себя Qt.WindowModal). Но не наоборот. Хотя вариант наоборот возможен в приложении. QMainWindow - главное, QWidget - дочернее. Только и всего. :)
Отредактировано (Ноя. 3, 2009 20:28:47)
Офлайн