添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

PyQt:如何在一个QListWidget中向右滚动?

0 人关注

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

我怎样才能自动向右滚动,使我看到文件名。 not 路径的开头? 这一定是个简单的设置,但我至今没有找到有用的文档或例子。

Code:

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_())

Result:

python
pyqt5
scrollbar
qlistwidget
theozh
theozh
发布于 2021-01-22
1 个回答
musicamante
musicamante
发布于 2021-01-22
已采纳
0 人赞同

所有继承自QAbstractScrollArea的widget都可以通过编程实现滚动(并且应该是 only 是通过设置其滚动条的值来完成的(即使它们不可见)。

由于像QListWidget这样的项目视图(它继承自QListView和QAbstractItemView)需要一些 time 为了正确布置新的项目,通常倾向于调用 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())

你甚至可以为所有的项目视图提供一个 "猴子打补丁 "的功能,把这个放在first脚本,导入QtWidgets。

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