Форум сайта python.su
2
Недавно начал использовать Python+PyQT.
Сначала пробовал создавать интерфейс при помощи QtDesigner'а, но что-то не всегда удается добиться нужных результатов. Начал и интерфейс делать вручную. Естественно, еще не все понятно и не все получается. Вот одна из первоочередных проблем.
Хочу сделать диалоговое окно с прокруткой. Если все правильно понимаю, то необходимый функционал мне даст QScrollArea, только вот никак не могу сообразить, каким образом заставить ее растянуться на всю область диалогового окна и отслеживать изменение его размеров.
Вот урезанный код создания диалога:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class dlgTest(QDialog):
def __init__(self, parent = None):
QDialog.__init__(self, parent)
# создаю необходимые элементы интерфейса
self.lblCount = QLabel()
self.lblCount.setText(self.tr("Objects selected:"))
.....
self.setWindowTitle(self.tr("Interface test"))
self.resize(500, 400)
if __name__ == "__main__":
app = QApplication(sys.argv)
frm = dlgTest()
frm.show()
sys.exit(app.exec_())
Офлайн
0
Расположением виджетов в Qt занимаются Layout-ы, читайте доку в этом направлении: http://doc.trolltech.com/4.5/layout.html
P.S. Вам отслеживать ничего не надо будет, лэйауты сами этим занимаются:)
Отредактировано (Апрель 24, 2009 19:11:43)
Офлайн
0
Все верно мыслите(QScrollArea). Только вам надо от нее унаследоваться, установить области прокрутки ну и
layout-ы естественно :). Если я правильно понял, то вам нужно вот это:
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class dlgTest(QScrollArea):
def __init__(self, parent = None):
QDialog.__init__(self, parent)
# устанавливаем горизонтальные/вертикальные области прокрутки
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.setVerticalScrollBarPolicy (Qt.ScrollBarAlwaysOn)
# создаю необходимые элементы интерфейса
self.lblCount = QLabel()
self.lblCount.setText(self.tr("Objects selected:"))
self.setWindowTitle(self.tr("Interface test"))
self.resize(500, 400)
# размещаем виджеты
layout = QVBoxLayout()
layout.addWidget(self.lblCount)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
frm = dlgTest()
frm.show()
sys.exit(app.exec_())
Офлайн
0
gmorgunov Человеку нужен диалог, нечего его мастерить из QScrollArea. А за последствия вот этого кода вы будете отвечать?:
class dlgTest(QScrollArea):
def __init__(self, parent = None):
QDialog.__init__(self, parent)
Офлайн
0
poltergeist. Проверил, приведенный код. Никаких последствий не увидел. Посмотрел дерево наследования:
QDialog —> QWidget, QScrollArea —> QAbstractScrollArea —> QFrame —> QWidget. В чем криминал?
Если не трудно, приведите пожалуйста код, поясняющий вашу мысль.
Офлайн
2
poltergeist, gmorgunov большое спасибо за помощь.
Про Layout-ы знаю, только вот не думал, что растягивать какой-то элемент на все окно нужно с их помощью. Видимо, тяжелое наследие Delphi :-). Там, чтобы установить размеры, например панели, нужно всего лишь установить свойство Align:=Client.
Не совсем понял, по поводу “мастерить из QScrollArea”. Код gmorgunov корректен или так делать не рекомендуется? Просто хочется все для себя разложить по полочкам.
Офлайн
0
Ггг:) Вот немного модифицированный код gmorgunov
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class dlgTest(QScrollArea):
def __init__(self, parent = None):
QDialog.__init__(self, parent)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.setVerticalScrollBarPolicy (Qt.ScrollBarAlwaysOn)
self.lblCount = QLabel()
self.lblCount.setText(self.tr("Objects selected:"))
self.setWindowTitle(self.tr("Interface test"))
self.lblCount.setFixedSize(QSize(500, 300))
layout = QVBoxLayout()
layout.addWidget(self.lblCount)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication(sys.argv)
frm = dlgTest()
frm.show()
sys.exit(app.exec_())
Отредактировано (Апрель 25, 2009 12:07:01)
Офлайн
0
poltergeist . Добавил пару надписей и кнопку, попробовал “поскроллить” - действительно не работает. Спасибо. Все встало на свои места. :)
Офлайн