鱼C论坛

 找回密码
 立即注册
查看: 261|回复: 15

滚动条的值如何取得100?

[复制链接]
发表于 2024-2-26 15:13:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我引用了一个滚动条

    from CustomProgressBar import CustomProgressBar


然后 # 添加滚动条到布局容器
        self.progressBar = CustomProgressBar(parent=self.verticalLayoutWidget_4)
        self.progressBar.scrollToCenter()
        self.progressBar.startAnimation()
        self.verticalLayout_4.addWidget(self.progressBar)

然后self.progressBar.setValue(0)
        self.progressBar.show()

然后value = self.progressBar.value()
        print(value)

我看到滚动条也有滚动到100%的啊,为什么打印出来value是0呢?


回复请注意python格式。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-26 15:13:46 | 显示全部楼层
你好!在你设置滚动条的值之前,你可能需要等待一段时间来确保滚动条已经滚动到100%的位置。你可以尝试使用延时函数来等待一段时间,然后再获取滚动条的值。

首先,导入`time`模块:

  1. import time
复制代码


然后,在设置滚动条值之后,添加一个延时函数来等待一段时间:

  1. self.progressBar.setValue(0)
  2. self.progressBar.show()

  3. # 等待2秒
  4. time.sleep(2)

  5. value = self.progressBar.value()
  6. print(value)
复制代码


这样,就给滚动条足够的时间来滚动到100%的位置,然后再获取其值。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 15:18:20 | 显示全部楼层
FishC 发表于 2024-2-26 15:13
你好!在你设置滚动条的值之前,你可能需要等待一段时间来确保滚动条已经滚动到100%的位置。你可以尝试使用 ...

貌似没有用  我延迟了整整10 秒,打印出来也是0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-26 15:18:42 | 显示全部楼层
清風 发表于 2024-02-26 15:18
貌似没有用  我延迟了整整10 秒,打印出来也是0


非常抱歉,我之前给出的方法有误。滚动条的值是由用户操作或者程序改变的,延时函数并不能正确获取滚动条的值。要想获取滚动条的值,你可以使用滚动条的`valueChanged`信号,当滚动条的值改变时触发该信号,并将新的值传递给相关的槽函数。

以下是一个简单的示例:

  1. from PyQt5.QtWidgets import QApplication, QScrollBar, QVBoxLayout, QWidget
  2. from PyQt5.QtCore import Qt

  3. class MyWidget(QWidget):
  4.     def __init__(self):
  5.         super().__init__()
  6.         
  7.         layout = QVBoxLayout(self)
  8.         
  9.         self.scrollBar = QScrollBar(Qt.Horizontal)
  10.         self.scrollBar.setMinimum(0)
  11.         self.scrollBar.setMaximum(100)
  12.         self.scrollBar.valueChanged.connect(self.onScrollBarValueChanged)
  13.         
  14.         layout.addWidget(self.scrollBar)
  15.         
  16.     def onScrollBarValueChanged(self, value):
  17.         if value == 100:
  18.             print("滚动条的值为100!")

  19. if __name__ == "__main__":
  20.     app = QApplication([])
  21.     widget = MyWidget()
  22.     widget.show()
  23.     app.exec_()
复制代码


这个示例中创建了一个水平方向的滚动条,并设置最小值为0,最大值为100。当滚动条的值改变时,会触发`onScrollBarValueChanged`槽函数。在该槽函数中,我们判断如果滚动条的值为100,则打印出相应的提示信息。

希望这次能对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 16:03:41 | 显示全部楼层
FishC 发表于 2024-2-26 15:18
非常抱歉,我之前给出的方法有误。滚动条的值是由用户操作或者程序改变的,延时函数并不能正确获取滚动 ...

报错:
self.progressBar.valueChanged.connect(self.onprogressBarValueChanged)
                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'MyForm' object has no attribute 'onprogressBarValueChanged'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-26 16:03:59 | 显示全部楼层
清風 发表于 2024-02-26 16:03
报错:
self.progressBar.valueChanged.connect(self ...


非常抱歉,我之前给出的示例代码有误。根据你提供的信息,看起来你使用的是自定义的进度条类`CustomProgressBar`,而不是Qt中的`QScrollBar`类。对于自定义的进度条类,你需要查看其文档或者源代码,确定是否提供了类似于`valueChanged`的信号。如果有的话,你可以将它连接到一个自定义的槽函数中,并在槽函数中检查滚动条的值是否为100。以下是一个基于自定义进度条类的示例:from CustomProgressBar import CustomProgressBarfrom PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidgetclass MyWidget(QWidget):    def __init__(self):        super().__init__()                layout = QVBoxLayout(self)                self.progressBar = CustomProgressBar()        self.progressBar.valueChanged.connect(self.onProgressBarValueChanged)                layout.addWidget(self.progressBar)            def onProgressBarValueChanged(self, value):        if value == 100:            print("滚动条的值为100!")if __name__ == "__main__":    app = QApplication([])    widget = MyWidget()    widget.show()    app.exec_()请注意,以上示例假设`CustomProgressBar`类确实提供了`valueChanged`信号,并且该信号在滚动条的值改变时被触发。如果这个自定义类并没有提供类似的信号,你需要查阅相关文档或者代码,找到正确的方法来获取滚动条的值。希望这次能对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 16:05:31 | 显示全部楼层
FishC 发表于 2024-2-26 16:03
非常抱歉,我之前给出的示例代码有误。根据你提供的信息,看起来你使用的是自定义的进度条类`CustomPro ...

回复请注意python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-26 16:05:50 | 显示全部楼层
清風 发表于 2024-02-26 16:05
回复请注意python格式


非常抱歉之前的回答没有按照正确的Python语法格式进行编写。以下是按照正确Python格式重新编写的示例代码:

  1. import time
  2. from CustomProgressBar import CustomProgressBar
  3. from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget

  4. class MyWidget(QWidget):
  5.     def __init__(self):
  6.         super().__init__()

  7.         layout = QVBoxLayout(self)

  8.         self.progressBar = CustomProgressBar()
  9.         self.progressBar.valueChanged.connect(self.onProgressBarValueChanged)

  10.         layout.addWidget(self.progressBar)

  11.     def onProgressBarValueChanged(self, value):
  12.         if value == 100:
  13.             print("滚动条的值为100!")
  14.             
  15. if __name__ == "__main__":
  16.     app = QApplication([])
  17.     widget = MyWidget()
  18.     widget.show()
  19.    
  20.     app.exec_()
复制代码


请确保在运行代码之前,已正确安装了需要的库,并将`CustomProgressBar`替换为你自己的自定义进度条类。希望这次能对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 16:29:47 | 显示全部楼层
FishC 发表于 2024-2-26 16:05
非常抱歉之前的回答没有按照正确的Python语法格式进行编写。以下是按照正确Python格式重新编写的示例代 ...

所引用的CustomProgressBar:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QProgressBar, QLabel
from PyQt6.QtCore import QTimer, Qt

class CustomProgressBar(QProgressBar):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setStyleSheet(
            """
            QProgressBar {
                text-align: center;  /* 将文本居中对齐 */
                color: white;  /* 设置文本颜色为白色 */
                border: none;
                background-color: #909090;  /* 设置背景色 */
                height: 20px;  /* 设置进度条高度 */
            }
            QProgressBar::chunk {
                background-color: #00A3E0;  /* 设置进度条颜色 */
            }
            """
        )
        self.setTextVisible(True)  # 显示进度文本
        # self.counter = 0
        self.setValue(0)

    def scrollToCenter(self):
        max_value = self.maximum()
        if max_value > 0:
            self.setValue(max_value)

    def startAnimation(self):
        self.timer = QTimer(self)
        self.timer.timeout.connect(self._animate)
        self.timer.start(100)

    def _animate(self):
        value = self.value() + 2
        if value > self.maximum():
            value = value % self.maximum()
        self.setValue(value)
        if value == 100:
            self.timer.stop()

class HuanYingWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        layout = QVBoxLayout(self)

        progressBar = CustomProgressBar()
        layout.addWidget(progressBar)
        progressBar.scrollToCenter()
        progressBar.startAnimation()

        self.setLayout(layout)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = HuanYingWindow()
    window.show()
    sys.exit(app.exec())

没有定义`valueChanged`信号....

回复请注意python格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-26 16:30:12 | 显示全部楼层
清風 发表于 2024-02-26 16:29
所引用的CustomProgressBar:
import sys
from PyQt ...


谢谢你提供了CustomProgressBar的完整代码。根据你提供的代码,我注意到CustomProgressBar类并没有定义valueChanged信号。所以,在获取滚动条值时,我们可以直接使用self.progressBar.value()来获取当前滚动条的值。以下是更新后的代码示例:

  1. import sys
  2. from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QProgressBar, QLabel
  3. from PyQt6.QtCore import QTimer

  4. class CustomProgressBar(QProgressBar):
  5.     def __init__(self, parent=None):
  6.         super().__init__(parent)
  7.         self.setStyleSheet(
  8.             """
  9.             QProgressBar {
  10.                 text-align: center;
  11.                 color: white;
  12.                 border: none;
  13.                 background-color: #909090;
  14.                 height: 20px;
  15.             }
  16.             QProgressBar::chunk {
  17.                 background-color: #00A3E0;
  18.             }
  19.             """
  20.         )
  21.         self.setTextVisible(True)
  22.         self.setValue(0)

  23.     def scrollToCenter(self):
  24.         max_value = self.maximum()
  25.         if max_value > 0:
  26.             self.setValue(max_value)

  27.     def startAnimation(self):
  28.         self.timer = QTimer(self)
  29.         self.timer.timeout.connect(self._animate)
  30.         self.timer.start(100)

  31.     def _animate(self):
  32.         value = self.value() + 2
  33.         if value > self.maximum():
  34.             value = value % self.maximum()
  35.         self.setValue(value)
  36.         if value == 100:
  37.             self.timer.stop()

  38. class HuanYingWindow(QWidget):
  39.     def __init__(self):
  40.         super().__init__()
  41.         self.initUI()

  42.     def initUI(self):
  43.         layout = QVBoxLayout(self)
  44.         self.progressBar = CustomProgressBar()
  45.         layout.addWidget(self.progressBar)
  46.         self.progressBar.scrollToCenter()
  47.         self.progressBar.startAnimation()
  48.         self.setLayout(layout)

  49.         self.showProgressBarValue()

  50.     def showProgressBarValue(self):
  51.         value = self.progressBar.value()
  52.         print(value)

  53.         if value < 100:
  54.             QTimer.singleShot(100, self.showProgressBarValue)

  55. if __name__ == "__main__":
  56.     app = QApplication(sys.argv)
  57.     window = HuanYingWindow()
  58.     window.show()
  59.     sys.exit(app.exec())
复制代码


在这个更新的示例代码中,我添加了一个名为`showProgressBarValue`的方法来以一定的时间间隔获取滚动条的值并打印出来。使用`QTimer.singleShot`函数来延迟一定时间后再次调用`showProgressBarValue`方法,从而实现了定期获取并打印滚动条的值。

希望这次能对你有所帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 16:39:48 | 显示全部楼层
FishC 发表于 2024-2-26 16:30
谢谢你提供了CustomProgressBar的完整代码。根据你提供的代码,我注意到CustomProgressBar类并没有定义 ...

然后HuanYing.py中

import sys
import time

from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QWidget, QApplication, QMessageBox
from CustomProgressBar import CustomProgressBar
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QFont, QColor

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(1440, 900)
        Form.setMinimumSize(QtCore.QSize(1440, 900))
        Form.setMaximumSize(QtCore.QSize(1440, 900))
        Form.setStyleSheet("background-color: rgb(135, 206, 235);")

        。。。

    if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myForm = MyForm()
    myForm.show()
    sys.exit(app.exec())

又要如何引用到这个100% value值呢?

回复请注意python格式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-26 16:40:20 | 显示全部楼层
清風 发表于 2024-02-26 16:39
然后HuanYing.py中

import sys
import time

fr ...


要获取CustomProgressBar滚动条的值,你可以在Ui_Form类中创建一个成员变量来保存CustomProgressBar实例,并在需要时访问它的值。下面是示例代码的更新部分:import sys
import time
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QWidget, QApplication, QMessageBox
from CustomProgressBar import CustomProgressBar
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QFont, QColor

class Ui_Form(object):
    def setupUi(self, Form):
        ...
        self.progressBar = CustomProgressBar(Form)
        self.progressBar.setGeometry(QtCore.QRect(510, 660, 420, 30))
        self.progressBar.setValue(0)
        ...
    def getProgressBarValue(self):
        value = self.progressBar.value()
        print(value)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myForm = MyForm()
    myForm.ui.getProgressBarValue() # 在合适的地方调用该函数获取滚动条的值
    myForm.show()
    sys.exit(app.exec())在上述示例代码中,我假设你的主窗口类为MyForm,并在setupUi函数中添加了一个成员变量`self.progressBar`来保存CustomProgressBar实例。然后,我在Ui_Form类中添加了一个函数`getProgressBarValue`来获取滚动条的值,并将其打印出来。

你需要在合适的位置调用`myForm.ui.getProgressBarValue()`来获取滚动条的值,并进行进一步处理。请注意,这个调用应该在显示窗口之后,否则可能无法正确获取滚动条的值。

希望这次能解决你的问题!如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 17:24:39 | 显示全部楼层
FishC 发表于 2024-2-26 16:40
要获取CustomProgressBar滚动条的值,你可以在Ui_Form类中创建一个成员变量来保存CustomProgressBar实 ...

打印出来滚动条的值  还是0......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-26 17:25:04 | 显示全部楼层
清風 发表于 2024-02-26 17:24
打印出来滚动条的值  还是0......


抱歉,我之前的解答可能有误。事实上,如果你直接在滚动条初始化之后立即调用`self.progressBar.value()`,它返回的值可能仍然是初始的值(通常为0)。这是因为滚动条的值是在事件循环中更新的,而不是立即更新。

要获取滚动条的最新值,可以使用Qt的信号-槽机制。首先,为自定义滚动条类添加一个信号,在值改变时发射该信号。然后,连接这个信号到一个槽函数,以便在滚动条值变化时执行相应的操作。以下是修改后的示例代码:

  1. from PyQt6 import QtCore, QtGui, QtWidgets

  2. class CustomProgressBar(QtWidgets.QProgressBar):
  3.     valueChanged = QtCore.pyqtSignal(int)
  4.    
  5.     def setValue(self, value):
  6.         super().setValue(value)
  7.         self.valueChanged.emit(value)

  8. class MyForm(QtWidgets.QWidget):
  9.     def __init__(self):
  10.         super().__init__()

  11.         self.ui = Ui_Form()
  12.         self.ui.setupUi(self)
  13.         
  14.         # 连接自定义滚动条的值改变信号到槽函数
  15.         self.ui.progressBar.valueChanged.connect(self.handleProgressBarValueChange)
  16.         
  17.     def handleProgressBarValueChange(self, value):
  18.         print(value)

  19. # 其他代码...
复制代码


在这个修改后的代码中,我们创建了一个名为`valueChanged`的自定义信号,并在`setValue`方法中发射这个信号。然后,在主窗口类的构造函数中,我们将这个信号连接到一个名为`handleProgressBarValueChange`的槽函数。每当滚动条的值发生改变时,这个槽函数会被调用,并将新的值打印出来。

请确保按照这个方法进行修改,并在滚动条值变化时检查控制台输出。希望这次能解决你的问题!如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-26 17:33:49 | 显示全部楼层
FishC 发表于 2024-2-26 17:25
抱歉,我之前的解答可能有误。事实上,如果你直接在滚动条初始化之后立即调用`self.progressBar.value( ...

我已经迷糊了,我重新开个贴再来问一次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-26 17:33:54 | 显示全部楼层
清風 发表于 2024-02-26 17:33
我已经迷糊了,我重新开个贴再来问一次。


没问题,请随时提问,我会尽力为您解答。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 04:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表