【问题标题】:PyQt: How to scroll to right in a QListWidget?PyQt:如何在 QListWidget 中向右滚动?
【发布时间】:2021-04-26 22:41:52
【问题描述】:

在 PyQt QListWidget 中,我使用完整路径拖放文件。现在我希望滚动条在每次拖入时滚动到右侧。 但是,似乎只有scrollToTop()scrollToBottom(),但我找不到scrollToLeft()scrollToRight() 或类似的东西。列表项文本的右对齐没有帮助,显然我需要向右滚动水平滚动条。

如何自动向右滚动,以便我看到文件名,不是路径的开头? 这一定是一个简单的设置,但到目前为止我还没有找到有用的文档或示例。

代码:

import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import QListWidget, QListWidgetItem, QApplication, QWidget, QAbstractItemView, QVBoxLayout

class MyListWidget(QListWidget):
    def __init__(self, parent):
        super(MyListWidget, self).__init__(parent)
        # self.setDragDropMode(QAbstractItemView.InternalMove)
        self.setAcceptDrops(True)

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls() or event.mimeData().hasFormat("text/plain"):
            event.acceptProposedAction()
        else:
            super(MyListWidget, self).dragEnterEvent(event)

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            for url in event.mimeData().urls():
                item = QListWidgetItem(url.toLocalFile())
                self.addItem(item)
            event.acceptProposedAction()
        elif event.mimeData().hasFormat("text/plain"):
            self.addItem(event.mimeData().text())
        else:
            super(myListWidget,self).dropEvent(event)
        self.scrollToBottom()                            ### but I want scrollToRight()  !!! 
        

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.left = 50 
        self.top = 50
        self.width = 900
        self.height = 500
        self.initUI()

    def initUI(self):
        self.vbox = QVBoxLayout()
        self.lw_myList = MyListWidget(self)
        self.vbox.addWidget(self.lw_myList)
        self.setLayout(self.vbox)
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    # app.setStyle("plastique")
    window = MyWindow()
    # window.show()
    sys.exit(app.exec_())

结果:

【问题讨论】:

    标签: python pyqt5 scrollbar qlistwidget


    【解决方案1】:

    通过设置滚动条的值(即使它们不可见),可以实现(并且应该完成)所有从 QAbstractScrollArea 继承的小部件的编程滚动。

    由于像 QListWidget(继承自 QListView 和 QAbstractItemView)这样的项目视图需要一些时间才能正确布置新项目,因此通常首选调用 QCoreApplication.processEvents() 并且为了安全起见, updateGeometries():

        def dropEvent(self, event):
            # ...
    
            # ensure that the event queue is correctly processed, which includes
            # laying out new items
            QApplication.processEvents()
            # ensure that the geometry of child widgets is correctly updated too
            self.updateGeometries()
            # finally, set the horizontal scroll bar to its maximum
            self.horizontalScrollBar().setValue(self.horizontalScrollBar().maximum())
    

    您甚至可以为所有项目视图提供“猴子补丁”功能,方法是将其放在导入 QtWidgets 的 first 脚本的开头:

    def itemViewScrollToRight(self):
        QApplication.processEvents()
        self.updateGeometries()
        self.horizontalScrollBar().setValue(
            self.horizontalScrollBar().maximum())
    
    QAbstractItemView.scrollToRight = itemViewScrollToRight
    
    # ...
        def dropEvent(self, event):
            # ...
            self.scrollToRight()
    

    PS:请注意,您应该始终实现 dragMoveEvent() 并接受自定义拖动实现的事件,因为 dragEnterEvent() 并不总是足够的。

    【讨论】:

    • 非常感谢。这很好用!当然,要查看不同长路径的结尾(即文件名),我还需要右对齐项目的文本item.setTextAlignment(Qt.AlignRight)
    猜你喜欢
    • 2020-10-16
    • 2019-04-02
    • 2013-04-20
    • 2023-03-29
    • 2012-09-25
    • 2021-08-12
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多