Область вкладки pyqt5 не заполняет все доступное пространство - PullRequest
0 голосов
/ 30 апреля 2018

Я экспериментирую с графическим интерфейсом - я хотел бы иметь полосы прокрутки и вкладки. Я возился с полосами прокрутки в качестве «самого внешнего» виджета, с QTabWidget внутри, а также с другой стороны: QTabWidget имеет вкладку QWidget, а родительский элемент QScrollArea - вкладка. Вкратце, я не могу заставить область прокрутки расширяться, чтобы заполнить доступное пространство. Ниже приведены некоторые комментарии, которые иллюстрируют все, что я пробовал. Никакая настройка sizePolicies не помогает. Я смотрел на похожие проблемы, которые опубликовали другие люди, в частности Проблема со scrollarea в pyqt?

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 17 07:07:08 2017

@author: Erik
"""

import sys
from PyQt5.QtWidgets import QLayout, QVBoxLayout ,QTabWidget, QMainWindow,QApplication, QWidget, QSizePolicy, QScrollArea
from PyQt5.QtGui import QColor, QPalette
from PyQt5.QtCore import QSize
class Color2(QWidget):

    def __init__(self, color, *args, **kwargs):
        super(Color2, self).__init__(*args, **kwargs)
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(color))
        self.setPalette(palette)
        self.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum))

    def sizeHint(self):
        return QSize(250,150)

class MyTableWidget(QWidget):
    def __init__(self, parent):   
        super(QWidget, self).__init__(parent)
        self.layout = QVBoxLayout(self)
        # Initialize tab screen
        self.tabs = QTabWidget(self)      
        self.layout.addWidget(self.tabs)
        #self.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored))
        #self.tabs.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored))

    def addTab(self, widget, text):
        self.tabs.addTab(widget, text)
        widget.setAutoFillBackground(True)
        my_yellow = QColor.fromHsl(35, 255, 153, 128 )
        dark_blue = QColor.fromHsl(211, 196, 38, 255)
        widget.palette().setColor(QPalette.Window, dark_blue)
        widget.palette().setColor(QPalette.WindowText, my_yellow)

class Example(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):               

        self.statusBar().showMessage('Ready')
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Statusbar')
        self.table_widget = MyTableWidget(self)
        self.tab1 = QWidget()        
        self.tab2 = QWidget()
        #self.tab1.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
        self.table_widget.addTab(self.tab1, "Tab1")
        self.table_widget.addTab(self.tab2, "Tab2")

        self.scrollArea = QScrollArea(self.tab1)
        #self.scrollArea = QScrollArea(self)
        self.scrollArea.setWidgetResizable(True)
        self.scrollAreaWidgetContents = QWidget(self.scrollArea)
        #self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 380, 247))
        self.scrollAreaWidgetContents.setMinimumSize(QSize(1100, 1300))
        #self.scrollAreaWidgetContents.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored))
        #self.scrollAreaWidgetContents.setWidgetResizable(True)
        #self.scrollArea.setWidget(self.scrollAreaWidgetContents)

        self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents)
        #self.verticalLayout.addWidget(self.scrollArea)
        self.verticalLayout.addWidget(Color2('blue'))
        self.verticalLayout.addWidget(Color2('red'))
        self.verticalLayout.insertStretch(-1)
        #self.verticalLayout.setSizeConstraint(1)#QLayout.SizeConstraint.setNoConstraint)
        self.verticallayout2 = QVBoxLayout(self.tab2)
        self.verticallayout2.addWidget(Color2('green'))

        #self.scrollArea.setSizePolicy(QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Expanding))
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)

        self.setCentralWidget(self.table_widget)
        self.show()
        print(self.table_widget.minimumSizeHint())

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Я изучил основы http://zetcode.com/gui/pyqt5/. Кроме того, одна подсказка в поведении приведенного выше кода заключается в том, что область, фактически используемая QScrollArea, каким-то образом связана с sizeHint класса Color2. У меня есть пример полос прокрутки, которые работают сами по себе, просто отлично ... я просто не понимаю, как они ведут себя на вкладке QTabWidget. Какие-нибудь советы? Спасибо большое.

1 Ответ

0 голосов
/ 30 апреля 2018

Проблема в том, что вы не используете макет для установки QScrollArea внутри вкладки. Когда вы устанавливаете, что один виджет является родительским для другого, вы только указываете, что дочерняя система координат относительно родительского, но не принимает размер родительского, для этого вы должны использовать макет, так как он обрабатывает размер.

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 17 07:07:08 2017

@author: Erik
"""

import sys
from PyQt5.QtWidgets import QLayout, QVBoxLayout ,QTabWidget, QMainWindow,QApplication, QWidget, QSizePolicy, QScrollArea
from PyQt5.QtGui import QColor, QPalette
from PyQt5.QtCore import QSize

class Color2(QWidget):
    def __init__(self, color, *args, **kwargs):
        super(Color2, self).__init__(*args, **kwargs)
        self.setAutoFillBackground(True)
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(color))
        self.setPalette(palette)
        self.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum))

    def minimumSizeHint(self):
        return QSize(250,150)

class MyTableWidget(QWidget):
    def __init__(self, parent):   
        super(QWidget, self).__init__(parent)
        self.layout = QVBoxLayout(self)
        self.tabs = QTabWidget(self)      
        self.layout.addWidget(self.tabs)

    def addTab(self, widget, text):
        self.tabs.addTab(widget, text)
        widget.setAutoFillBackground(True)
        my_yellow = QColor.fromHsl(35, 255, 153, 128 )
        dark_blue = QColor.fromHsl(211, 196, 38, 255)
        widget.palette().setColor(QPalette.Window, dark_blue)
        widget.palette().setColor(QPalette.WindowText, my_yellow)

class Example(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):               

        self.statusBar().showMessage('Ready')
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Statusbar')
        self.table_widget = MyTableWidget(self)
        self.tab1 = QWidget()        
        self.tab2 = QWidget()
        self.table_widget.addTab(self.tab1, "Tab1")
        self.table_widget.addTab(self.tab2, "Tab2")
        lay = QVBoxLayout(self.tab1)

        self.scrollArea = QScrollArea()
        lay.addWidget(self.scrollArea)
        self.scrollArea.setWidgetResizable(True)
        self.scrollAreaWidgetContents = QWidget()
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)

        self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents)
        self.verticalLayout.addWidget(Color2('blue'))
        self.verticalLayout.addWidget(Color2('red'))
        self.verticalLayout.insertStretch(-1)
        self.verticallayout2 = QVBoxLayout(self.tab2)
        self.verticallayout2.addWidget(Color2('green'))

        self.scrollArea.setWidget(self.scrollAreaWidgetContents)

        self.setCentralWidget(self.table_widget)
        self.show()

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

enter image description here

...