如何确定scrollArea的滚动条是否在PyQt5中可见?

时间:2017-07-27 14:10:43

标签: python python-3.x pyqt pyqt5 qscrollarea

好。问题似乎很容易,但我得到的结果与我的期望不同。

我有一个应用,其高度取决于其内容。这是自动调整大小的代码:

def resizeApp(self):
    n = len(self.listOfWidgets) 
    if self.screenHEIGHT - 40 > n * 125 + 50:
        self.resize(self.width(), n * 125 + 50)
        self.scrollArea.resize(self.scrollArea.width(), n * 125 + 20)
    else:
        self.resize(self.width(), self.screenHEIGHT - 40)
        self.scrollArea.resize(self.scrollArea.width(), self.screenHEIGHT - 40 - 30)
    print(self.scrollArea.verticalScrollBar().isVisible())

您可以看到调整大小后我们可以定义verticalScrollbar的可见性。查看应用和控制台截图。我们可以看到该应用程序有verticalScrollbar,但控制台说它没有。似乎isVisible()有点滞后并告诉我以前的状态。

例如。当我添加小部件时,虽然没有verticalScrollbar,但控制台显示为False(verticalScrollbar不可见)。当小部件的数量需要verticalScrollbar时,scrollArea会创建此verticalScrollbar,但是我收到的消息是verticalScrollbar不可见。之后,在添加了一个小部件后,我收到了verticalScrollbar可见的消息。

反之亦然。当我删除小部件时,我收到一条消息,即删除了一个小部件后,verticalScrollbar可见。但它应该说我"错误"提前一步。

我错过了什么吗?

UPDATE1。根据要求,我添加了一个没有冗余代码的工作示例。您可以从我的保管箱>here<

下载zip存档

>Virustotal.com analysis<

App screenshot

2 个答案:

答案 0 :(得分:2)

假设你覆盖了你的QScrollArea类,所以你只需要设置它的策略,它就是这样的:

self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

通过这种方式,您可以选择要查看的任何栏,何时以及哪一个,只需在需要时设置这些政策。

这是我前段时间做过的QScrollArea,对我来说完全有效:

"""It takes care of the scroll area with slides."""

# !/usr/bin/python
# -*- coding: utf-8 -*-

from PyQt5.QtCore import QPoint
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QScrollArea


class ScrollArea(QScrollArea):
    """ScrollArea is a personalized scroll area."""

    initial_pos = QPoint()
    pressed = False

    def __init__(self, parent=None):
        """Init UI."""

        super(ScrollArea, self).__init__(parent)
        self.init_ui()

    def init_ui(self):
        """Init all ui object requirements."""

        self.setFixedWidth(200)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setStyleSheet("""

            QScrollArea{
                background-color:transparent;
                border-top-right-radius: 4px;
                border-top-left-radius: 4px;
                border-bottom-right-radius: 4px;
                border-bottom-left-radius: 4px;
                border: 0px solid ;
                border-color: rgb(0,0,0,100)
            }

            QScrollBar:vertical{
                border:1px solid;
                border-color: rgb(197,197,199,100);
                width: 7px;
                margin: 0px 0px 0px 0px;
                background: rgb(234,234,234,100);


            }

            QScrollBar::handle:vertical  {
                background: rgba(14,65,148,100);
            }

            QScrollBar::add-line:vertical{
                height: 0px;
            }

            QScrollBar::sub-line:vertical{
                height: 0px;
            }

        """)

        self.setWidgetResizable(True)

    def mousePressEvent(self, event):
        """Update initial click location of scroll area."""

        self.pressed = True
        self.initial_pos = self.verticalScrollBar().value() + event.pos().y()

    def mouseReleaseEvent(self, event):
        """Update next location to be used in scroll area location."""

        self.pressed = False
        self.initial_pos = self.verticalScrollBar().value()

    def mouseMoveEvent(self, event):
        """Update value location of scroll area according to init location."""
        if self.pressed:
            self.verticalScrollBar().setValue(
                 self.initial_pos - event.pos().y())

答案 1 :(得分:0)

在尝试应用许多不同的解决方案之后,我来到最简单的解决方案。这个不是最合适的,但它解决了我的问题。

如果我有两个代码分支,它们确定小部件高度并依赖于内部小部件的数量,因此我可以预测何时需要滚动条。这就是为什么我们可以在&#34;&#34;的这两个分支中更改主要小部件的宽度的原因。以下是调整大小功能的更改方式:

def resizeApp(self):
    n = len(self.listOfWidgets) 
    if self.screenHEIGHT - 40 > n * 125 + 50:
        self.resize(135, n * 125 + 50)
        self.scrollArea.resize(self.scrollArea.width(), n * 125 + 20)
    else:
        self.resize(150, self.screenHEIGHT - 40)
        self.scrollArea.resize(self.scrollArea.width(), self.screenHEIGHT - 40 - 30)

那就是它!