无法连接PySide QTableView selectionChanged sign

2024-09-29 21:30:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设计一个程序,它由一个3D查看器和一个带有python3.4和PySide绑定的表组成。在

我用这个类创建了一个TableView:

from PySide import QtGui
from PySide.QtCore import Qt

class MyTableView(QtGui.QWidget):

    def __init__(self, parent=None):
        super(MyTableView, self).__init__()
        self.parent = parent
        self.title = "Results"
        self.initUI()

    def initUI(self):
        self.grid = QtGui.QGridLayout(self)

        self.table = QtGui.QTableView()
        self.grid.addWidget(self.table, 0, 0)
        # Configure table
        self.table.verticalHeader().setVisible(False)
        self.table.horizontalHeader().setDefaultAlignment(Qt.AlignLeft)
        self.table.setSortingEnabled(True)
        self.table.setAlternatingRowColors(True)
        self.table.setShowGrid(False)
        self.table.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
        self.table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)

还有另一个类的模型:

^{pr2}$

然后在该控制器中绑定在一起:

from PySide.QtCore import Qt

class MyController(object):

    def __init__(self, model, view):
        self.model = model
        self.tableview = view.table
        self.fill_table()
        self.connect_signals()

    def fill_table(self):
        self.tableview.setModel(self.model)
        self.tableview.sortByColumn(0, Qt.AscendingOrder)

    def connect_signals(self):
        selectionModel = self.tableview.selectionModel()
        selectionModel.selectionChanged.connect(self.selection_changed)

    def selection_changed(self, selected, deselected):
        print("Selection changed.")

然后,程序通过以下脚本执行:

def main():
    app = QtGui.QApplication(sys.argv)
    MyController(MyModel(sys.argv[1]), MyView())
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

(请注意,我还没有发布主窗口类,但您已经知道了)

表呈现得很好,但是我无法将selectionChanged信号连接到处理程序(它应该更新查看器,但出于测试目的,它只是一个print语句)。在

我做错什么了?谢谢!在

[编辑] 我发现如果我使用lambda函数来调用handler方法,它是有效的。有人能解释一下为什么吗?!在

selectionModel.selectionChanged.connect(lambda: self.selection_changed(selectionModel.selectedRows()))

Tags: fromimportselfmodelinitdefconnecttable
1条回答
网友
1楼 · 发布于 2024-09-29 21:30:42

我试着实现你写的东西,但它奏效了——所以我不能100%肯定你为什么会遇到麻烦。但我怀疑这是因为我必须修复才能让它工作起来:我必须解决垃圾收集方面的一些问题。在

在您给出的示例代码中,您创建了一个MyController、一个MyModel和一个MyView。但是它们都将被垃圾回收(在CPython中),因为您不保留对它们的引用。如果添加对MyController的引用

my_controller = MyController(MyModel(sys.argv[1]), MyView())

您已经快到了,但是我认为MyTableView也可能会被垃圾回收,因为控制器只保留对QTableVIew的引用,而不是{}。在

大概使用lanbda函数会改变你要保存的引用-它保留了控制器和选择模型-这可能就是它在这种情况下起作用的原因。在

一般来说,使用Qt父母机制是个好主意。如果您只是在主窗口(或其自然父窗口小部件)上为所有这些对象设置父对象,则可以避免大多数这些问题。在

相关问题 更多 >

    热门问题