Найти - Пользователи
Полная версия: Два нубских вопроса по PyQt4
Начало » GUI » Два нубских вопроса по PyQt4
1 2
Enchantner
Первый: Как сделать родительское окно полностью неактивным (не принимающим ввод от пользователя и не дающим переключить себя на топлевел) при вызове дочернего?
Второй: Как запретить изменение размера для окна?
villager
1)вроде никак
но можно сделать его setDisabled(True)
2) setFixedSize
poltergeist
Enchantner Тебе похоже надо просто сделать модальный диалог
pasaranax
1) widget.setWindowModality(Qt.ApplicationModal) - это блочит все приложение, еще есть параметр Qt.WindowModal, который блочит только родительское окно и Qt.NonModal, который ничего не блочит и является умолчательным.
Enchantner
pasaranax
У меня родительское окно типа QMainWindow, а дочернее - QWidget. Твой пример запускается без ошибок, но не работает :) Или я что-то не так делаю…

villager
насчет setFixedSize спасибо большое :)
pasaranax
Enchantner
У меня родительское окно типа QMainWindow, а дочернее - QWidget. Твой пример запускается без ошибок, но не работает smile Или я что-то не так делаю…
Я пробовал с родителем QWidget и ребенком QDialog. Как ты QWidget окном сделал, можешь кусок кода показать? Может применяешь модальность не к тому?

ps: вот мой пример:
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_())
villager
villager
1)вроде никак
но можно сделать его setDisabled(True)
сорри…ввел в заблуждение…

Просто я делал интерфейс как в firefox - с закладками, в каждой -QMdiArea,
как ни пробовал - модальные окна в каждой закладке (но при этом QTabBar - доступен) получилось
сделать только с помощью setDisabled предыдущего окна…
может есть решение и попроще?
gmorgunov
Привет. Как у вас сделано: главное окно - это 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.
Если сделать наоборот MainWindow - QWidget, Widget - QMainWindow - то все заработает.
Первое нажатие кнопки устанавливает модальность, далее сколько кнопку ни жать- главное окно будет заблокировано от ввода. Если я, конечно, все правильно понял.:)
#!/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_())
poltergeist
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_())
А вообще тут диалог уместнее… dialog.exec_()
gmorgunov
poltergeist
Рад бы ошибится, да факты не позволяют. :) Почему мой пример работает? А наоборот нет? Причем работает точно так, как ваш( если закоментировать #self.modal.show() в конструкторе. По-моему дело именно в классовом родстве (иерархии Qt). Пример с Qt.ApplicationModal - не совсем корректен. Тут блокируется окно верхнего уровня в приложении . Вы приведите пример с Qt.WindowModal?
Вывод: потомок в приложении может заблокировать родителя в приложении, если он стоит ниже в иерархии Qt.
( установив у себя Qt.WindowModal). Но не наоборот. Хотя вариант наоборот возможен в приложении. QMainWindow - главное, QWidget - дочернее. Только и всего. :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB