PyQt:如何在 QListWidget 中向右滚动?
PyQt: How to scroll to right in a QListWidget?
在 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_())
结果:
所有继承自 QAbstractScrollArea 的小部件的编程滚动可以通过设置其滚动条的值(即使它们不可见)来实现(并且应该 仅 完成)。
由于像 QListWidget(继承自 QListView 和 QAbstractItemView)这样的项目视图需要一些 时间 才能正确布置新项目,因此通常首选调用 QCoreApplication.processEvents()
and, just to be safe, 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()
并不总是足够的。
在 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_())
结果:
所有继承自 QAbstractScrollArea 的小部件的编程滚动可以通过设置其滚动条的值(即使它们不可见)来实现(并且应该 仅 完成)。
由于像 QListWidget(继承自 QListView 和 QAbstractItemView)这样的项目视图需要一些 时间 才能正确布置新项目,因此通常首选调用 QCoreApplication.processEvents()
and, just to be safe, 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()
并不总是足够的。