Найти - Пользователи
Полная версия: QScrollArea растянуть на всю форму
Начало » GUI » QScrollArea растянуть на всю форму
1
voltron
Недавно начал использовать 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_())
Буду рад любой помощи
poltergeist
Расположением виджетов в Qt занимаются Layout-ы, читайте доку в этом направлении: http://doc.trolltech.com/4.5/layout.html

P.S. Вам отслеживать ничего не надо будет, лэйауты сами этим занимаются:)
gmorgunov
Все верно мыслите(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_())
poltergeist
gmorgunov Человеку нужен диалог, нечего его мастерить из QScrollArea. А за последствия вот этого кода вы будете отвечать?:
class dlgTest(QScrollArea):
def __init__(self, parent = None):
QDialog.__init__(self, parent)
…. инициализировать QScrollArea уже не нужно? или может QDialog является сабклассом QScrollArea?
А вообще конечно молодец, не поленился пример сделать, в отличие от меня:)
gmorgunov
poltergeist. Проверил, приведенный код. Никаких последствий не увидел. Посмотрел дерево наследования:
QDialog —> QWidget, QScrollArea —> QAbstractScrollArea —> QFrame —> QWidget. В чем криминал?
Если не трудно, приведите пожалуйста код, поясняющий вашу мысль.
voltron
poltergeist, gmorgunov большое спасибо за помощь.
Про Layout-ы знаю, только вот не думал, что растягивать какой-то элемент на все окно нужно с их помощью. Видимо, тяжелое наследие Delphi :-). Там, чтобы установить размеры, например панели, нужно всего лишь установить свойство Align:=Client.
Не совсем понял, по поводу “мастерить из QScrollArea”. Код gmorgunov корректен или так делать не рекомендуется? Просто хочется все для себя разложить по полочкам.
poltergeist
Ггг:) Вот немного модифицированный код 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_())
Попробуйте что-то поскролить:))))))))))) Код в принципе не верный!!!

Вам надо отнаследовать класс QDialog, создать в нём лэйаут диалога, в котором будут кнопки всякие и сама QScrollArea. Потом надо будет сделать: scrollbar.setWidget(your_scrolled_panel), где your_scrolled_panel - это просто виджет (QImage, QLabel, …) или виджет со своим лэйаутом и другими виджетами - то что вы будете скролить.

http://doc.trolltech.com/4.5/qscrollarea.html
gmorgunov
poltergeist . Добавил пару надписей и кнопку, попробовал “поскроллить” - действительно не работает. Спасибо. Все встало на свои места. :)
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