- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 QListView 的 Qwidget 中嵌入了 QPushbutton:QPushbutton >> QWidget >> QListView
list_widget = QWidget()
list_widget.layout(QHBoxLayout())
btn = QPushButton()
btn.pressed.connect(clicked)
list_widget.layout().addWidget(QPushButton())
list_view.setIndexWidget(self.list_model.index(row, 0), list_widget)
def clicked():
row = list_view.selectedIndexes()
现在的问题是 list_view.selectedIndexes() 在按下时不会返回按下按钮的行。这似乎只有当 QPushbutton 直接嵌入到 QListView 中时才有效:QPushbutton >> QListView。
有人知道如何将按钮的焦点委托(delegate)给 QListView 吗?
最佳答案
当您单击按钮时,它不会传输到 QListView,因为按钮会消耗它并且不会将其传输到其他小部件,因此如果您想获取该行,则必须间接获取它,一个可能的解决方案是使用对于它的几何形状,您必须获取发送者(在本例中为按钮),然后将其左上角转换为全局位置,然后将其转换为相对于 QListView 视口(viewport)的本地位置,使用该位置与方法 indexAt( )
你得到了 QModelIndex。
from PyQt5 import QtCore, QtGui, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.list_model = QtGui.QStandardItemModel(200, 1)
self.list_view = QtWidgets.QListView()
self.list_view.setModel(self.list_model)
self.setCentralWidget(self.list_view)
for row in range(self.list_model.rowCount()):
list_widget = QtWidgets.QWidget()
hlay = QtWidgets.QHBoxLayout(list_widget)
btn = QtWidgets.QPushButton(str(row))
btn.pressed.connect(self.clicked)
hlay.addWidget(btn)
hlay.setContentsMargins(0, 0, 0, 0)
self.list_view.setIndexWidget(self.list_model.index(row, 0), list_widget)
@QtCore.pyqtSlot()
def clicked(self):
btn = self.sender()
gp = btn.mapToGlobal(QtCore.QPoint())
lp = self.list_view.viewport().mapFromGlobal(gp)
ix = self.list_view.indexAt(lp)
print("row", ix.row())
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
另一种更简单的方法是使用 functools.partial()
将行作为参数传递:
from functools import partial
from PyQt5 import QtCore, QtGui, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.list_model = QtGui.QStandardItemModel(200, 1)
self.list_view = QtWidgets.QListView()
self.list_view.setModel(self.list_model)
self.setCentralWidget(self.list_view)
for row in range(self.list_model.rowCount()):
list_widget = QtWidgets.QWidget()
hlay = QtWidgets.QHBoxLayout(list_widget)
btn = QtWidgets.QPushButton(str(row))
btn.pressed.connect(partial(self.clicked, row))
hlay.addWidget(btn)
hlay.setContentsMargins(0, 0, 0, 0)
self.list_view.setIndexWidget(self.list_model.index(row, 0), list_widget)
@QtCore.pyqtSlot(int)
def clicked(self, row):
print(row)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
或者使用 lambda 方法:
from PyQt5 import QtCore, QtGui, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.list_model = QtGui.QStandardItemModel(200, 1)
self.list_view = QtWidgets.QListView()
self.list_view.setModel(self.list_model)
self.setCentralWidget(self.list_view)
for row in range(self.list_model.rowCount()):
list_widget = QtWidgets.QWidget()
hlay = QtWidgets.QHBoxLayout(list_widget)
btn = QtWidgets.QPushButton(str(row))
btn.pressed.connect(lambda *args, row=row: self.clicked(row))
hlay.addWidget(btn)
hlay.setContentsMargins(0, 0, 0, 0)
self.list_view.setIndexWidget(self.list_model.index(row, 0), list_widget)
@QtCore.pyqtSlot(int)
def clicked(self, row):
print(row)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
<小时/>
就我而言,我更喜欢使用部分,因为您不需要编写大量逻辑并且它是线程安全的。
关于python - 嵌入 QWidget 时 QListView 选定索引未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53804021/
我有一个关于 c++ 中的 qt 的问题 头文件: #ifndef TIMER_H #define TIMER_H #include #include #include #include cl
我有以下代码: import os from functools import partial import numpy as np from PyQt5 import QtCore, QtWidge
我有一个 QWidget B,它包含在 QWidget A 中。QWidget A 有一个 QLabel。我在 QWidget B 中有一些数据,我想将其设置为 QLabel 的值。这种事情怎么办?
为了解释这种情况,我有一个 QMainWindow,里面有很多东西。我的目标是制作某种通知,显示在该窗口的右下角。 通知小部件必须位于所有其他小部件之上。 到目前为止,我已经创建了从 QWidget
这个问题对我来说可能是缺乏对 C++ 的理解,因为我为我的问题考虑过的所有可能性似乎都无法说明为什么会发生这种情况。感谢反馈。 我正在使用表单设计器创建一个包含表格的表单类。我正在尝试用辅助类中生成的
我选择使用 Qt 来管理我正在处理的项目的 GUI。 在找到如何在我的 QWidget 底部应用图片后,我注意到它对添加到其中的所有组件都有影响。 无论通过 setStyleSheet 方法或什至使用
我有一个带有两个小部件的主窗口,buttonsWidget 和 infoWidget。我试图在单击 buttonsWidget 中的按钮后隐藏 infoWidget(并最终显示不同的小部件)。 我试过
虽然 Qt's docs表明这两个功能是不同的(第一个不包括框架)无论我选择什么小部件 - 包括我的应用程序的主窗口 - someWidget->frameGeometry().height()始终返
这是包含一系列小部件的 QFormLayout 的屏幕截图。请注意,顶部和底部输入小部件未与中间两行水平对齐。另请注意,左侧的标签未与中间两行垂直对齐。 不同之处在于顶部和底部小部件是普通的 QLin
我有几个小部件,比如 QLineEdit m_namePoiFilter; QLineEdit m_ID_MSSIPoiFilter; 我想将它们添加到 qwi
我创建了一个非常简单的 QWidget 子类,如下所示: class WorldView : public QWidget { Q_OBJECT public: explicit Wo
我在屏幕上有很多固定的 qwidgets,还有很多其他的 widgets 我可以在屏幕上拖动。当一个小部件被拖动到固定小部件之上时,固定小部件需要执行一些代码。我无法弄清楚静止对象如何知道它上面有一个
我正在使用 Qt 设计器 4.8.7,从它开始。我创建了一个 MainWindow ,我想在其中加载布局。 我有一个小部件,由 Qt 设计器使用 pyuic4 生成。 我加载我的小部件正在做 self
我正在尝试使 QWidget 粘在屏幕右边框上,并在左侧显示/隐藏另一个 QWidget。我们的目标是在决赛中实现类似的目标: ---------------------------------- |
完全使用 QT Designer。我创建了一个 QWidget 来封装一组控件。我现在想在 QMainWindow 表单中多次使用此 QWidget。 如何仅使用 QT Designer 将我的 QW
我有一组出现在不同地方的小弹出窗口小部件,但每次只出现一个。对于简单的功能,new-to-show 和 delete-to-hide 没问题,并且按预期工作,但当它们开始处理自己的数据时,我可以看到内
我有一些 QWidget 类,它的 ui 文件与 QMainWindow ui 文件是分开的。 如何将粘附到 QMainWindow 的当前 QWidet 添加或替换为来自同一 QMainWindow
我正在使用基于 QWidget 的 PyQt 开发应用程序。我将整个应用程序放在一个类中(名为“示例”)。在这个应用程序中,我有一个按钮可以调用我在 QtDesigner 上设计的另一个 QWidge
在运行时尝试向 QWidget 添加按钮时,我遇到了一个奇怪的问题。我有一个带有 QTabWidget 的窗口,它有 2 个选项卡。当我按下窗口上的按钮时,它会在第一个选项卡上生成一组复选框。 问题是
我正在尝试运行一个简单的 Qt 程序,这样做时,我得到一个控制台窗口,提示:QWidget: Cannot create a QWidget when no GUI is being used,第二行
我是一名优秀的程序员,十分优秀!