Найти - Пользователи
Полная версия: PyQt 4.6 скролл
Начало » GUI » PyQt 4.6 скролл
1
FLeX
Наиглупейший вопрос для тех, кто сталкивался: как организовать скролл?
Имеем:
1. Окно (QMainWindow)
2. Центральный виджет (QWidget) в котором п.3
3. Два QVBoxLayout. Один вложен в другой
4. Куча динамически создающихся QLabel во внутреннем слое
Необходимо прокручивать содержимое внутреннего слоя.

Можно не кодом, а последовательностью действий, ибо я просто не могу понять принцип работы всей этой конструкции. Говорят, слои должны сами за этим следить, но что-то нифига скроллбар не появляется сам

Код прилагается:
# -*- coding: utf-8 -*-
import file_handler
import sys
from PyQt4 import QtGui, QtCore

class View_log (QtGui.QMainWindow):
log = file_handler.read_file('log.yml')

def __init__ (self):
QtGui.QMainWindow.__init__(self, None)

self.setWindowTitle(u'Просмотр лога')
self.setFixedSize(500, 600)
self.center()

self.create_widgets()

def create_widgets (self):
general_sizer = QtGui.QVBoxLayout()
all_entry_sizer = QtGui.QVBoxLayout()
scroll_area = QtGui.QScrollArea()
scroll_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)

for id in self.log:
entry = self.log[id]
one_entry_sizer = QtGui.QVBoxLayout()

info_student = entry[0].decode('utf-8')
info_group = entry[1].decode('utf-8')
info_theme = entry[2].decode('utf-8')
info_grade = entry[3]

student = QtGui.QLabel('%s: %s' % (u'Студент', info_student))
group = QtGui.QLabel('%s: %s' % (u'Группа', info_group))
theme = QtGui.QLabel('%s: %s' % (u'Тема', info_theme))
grade = QtGui.QLabel('%s (%%): %s' % (u'Оценка', info_grade))

one_entry_sizer.addWidget(student)
one_entry_sizer.addWidget(group)
one_entry_sizer.addWidget(theme)
one_entry_sizer.addWidget(grade)
one_entry_sizer.addStretch(1)

all_entry_sizer.addLayout(one_entry_sizer)

id += 1

exit_button = QtGui.QPushButton(u'Выход')
exit_button.clicked.connect(self.close)

#general_sizer.addLayout (all_entry_sizer)
general_sizer.addWidget(exit_button)
scroll_area.setLayout(all_entry_sizer)
#scroll_area.setLayout(general_sizer)
self.setCentralWidget(scroll_area)

def center (self):
screen = QtGui.QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) / 2,
(screen.height() - size.height()) / 2)

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = View_log()
window.show()
app.exec_()
FLeX
Решено
# -*- coding: utf-8 -*-
import file_handler
import sys
from PyQt4 import QtGui, QtCore

class View_log (QtGui.QMainWindow):
log = file_handler.read_file('log.yml')

def __init__ (self):
QtGui.QMainWindow.__init__(self, None)

self.setWindowTitle(u'Просмотр лога')
self.setFixedSize(500, 600)
self.center()

self.create_widgets()

def create_widgets (self):
scroll_widget = QtGui.QWidget()
central_widget = QtGui.QWidget()
general_sizer = QtGui.QVBoxLayout()
all_entry_sizer = QtGui.QVBoxLayout()
scroll_area = QtGui.QScrollArea()

for id in self.log:
entry = self.log[id]
one_entry_sizer = QtGui.QVBoxLayout()

info_student = entry[0].decode('utf-8')
info_group = entry[1].decode('utf-8')
info_theme = entry[2].decode('utf-8')
info_grade = entry[3]

student = QtGui.QLabel('%s: %s' % (u'Студент', info_student))
group = QtGui.QLabel('%s: %s' % (u'Группа', info_group))
theme = QtGui.QLabel('%s: %s' % (u'Тема', info_theme))
grade = QtGui.QLabel('%s (%%): %s' % (u'Оценка', info_grade))

one_entry_sizer.addWidget(student)
one_entry_sizer.addWidget(group)
one_entry_sizer.addWidget(theme)
one_entry_sizer.addWidget(grade)

all_entry_sizer.addLayout(one_entry_sizer)

scroll_widget.setLayout(all_entry_sizer)
scroll_area.setWidget(scroll_widget)

exit_button = QtGui.QPushButton(u'Выход')
exit_button.clicked.connect(self.close)

general_sizer.addWidget(scroll_area)
general_sizer.addWidget(exit_button)

central_widget.setLayout(general_sizer)

self.setCentralWidget(central_widget)

def center (self):
screen = QtGui.QDesktopWidget().screenGeometry()
size = self.geometry()
self.move((screen.width() - size.width()) / 2,
(screen.height() - size.height()) / 2)

if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
window = View_log()
window.show()
app.exec_()
Ardling
А можно как-то намекнуть, какое решение было найдено? У меня абсолютно аналогичная проблема.
annndrey
По сути решение состоит в следующем (по http://python.su/forum/viewtopic.php?id=4283):

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

Вот.
FLeX
Ardiling
Вот ссылка на рабочий код. Там, вроде, все очевидно.
http://dumpz.org/18271/
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