Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 2, 2009 20:01:17

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

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

Первый: Как сделать родительское окно полностью неактивным (не принимающим ввод от пользователя и не дающим переключить себя на топлевел) при вызове дочернего?
Второй: Как запретить изменение размера для окна?



Отредактировано (Ноя. 2, 2009 20:02:42)

Офлайн

#2 Ноя. 2, 2009 22:07:06

villager
От:
Зарегистрирован: 2008-11-04
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

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

1)вроде никак
но можно сделать его setDisabled(True)
2) setFixedSize



Офлайн

#3 Ноя. 2, 2009 22:19:23

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

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

Enchantner Тебе похоже надо просто сделать модальный диалог



Офлайн

#4 Ноя. 2, 2009 23:52:08

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

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

1) widget.setWindowModality(Qt.ApplicationModal) - это блочит все приложение, еще есть параметр Qt.WindowModal, который блочит только родительское окно и Qt.NonModal, который ничего не блочит и является умолчательным.



Отредактировано (Ноя. 2, 2009 23:54:20)

Офлайн

#5 Ноя. 3, 2009 00:46:49

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

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

pasaranax
У меня родительское окно типа QMainWindow, а дочернее - QWidget. Твой пример запускается без ошибок, но не работает :) Или я что-то не так делаю…

villager
насчет setFixedSize спасибо большое :)



Отредактировано (Ноя. 3, 2009 00:47:36)

Офлайн

#6 Ноя. 3, 2009 01:54:19

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

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

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



Отредактировано (Ноя. 3, 2009 01:57:09)

Офлайн

#7 Ноя. 3, 2009 10:19:34

villager
От:
Зарегистрирован: 2008-11-04
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

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

villager
1)вроде никак
но можно сделать его setDisabled(True)
сорри…ввел в заблуждение…

Просто я делал интерфейс как в firefox - с закладками, в каждой -QMdiArea,
как ни пробовал - модальные окна в каждой закладке (но при этом QTabBar - доступен) получилось
сделать только с помощью setDisabled предыдущего окна…
может есть решение и попроще?



Офлайн

#8 Ноя. 3, 2009 12:19:08

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

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

Привет. Как у вас сделано: главное окно - это 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_())



Офлайн

#9 Ноя. 3, 2009 14:07:15

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

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

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



Офлайн

#10 Ноя. 3, 2009 19:40:31

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

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

poltergeist
Рад бы ошибится, да факты не позволяют. :) Почему мой пример работает? А наоборот нет? Причем работает точно так, как ваш( если закоментировать #self.modal.show() в конструкторе. По-моему дело именно в классовом родстве (иерархии Qt). Пример с Qt.ApplicationModal - не совсем корректен. Тут блокируется окно верхнего уровня в приложении . Вы приведите пример с Qt.WindowModal?
Вывод: потомок в приложении может заблокировать родителя в приложении, если он стоит ниже в иерархии Qt.
( установив у себя Qt.WindowModal). Но не наоборот. Хотя вариант наоборот возможен в приложении. QMainWindow - главное, QWidget - дочернее. Только и всего. :)



Отредактировано (Ноя. 3, 2009 20:28:47)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version