QTableView点击信号从未发出?

Posted

技术标签:

【中文标题】QTableView点击信号从未发出?【英文标题】:QTableView clicked signal never emited? 【发布时间】:2018-10-11 07:53:26 【问题描述】:

我开始变得更加困惑。我不能像我想要的那样让 QTableView 发出它的信号。我将我的情况简化为不那么混乱的情况,即使在这种情况下,当我点击时我也无法获得任何信号。

例如,在该代码中,插槽“onClickedRow”在启动应用程序时被调用一次(我不知道为什么),但是我可以在任何地方随意点击,并且永远不会调用插槽:

import sys
from PySide2 import QtWidgets, QtCore, QtGui


class Message(QtCore.QAbstractItemModel):
    def __init__(self):
        super().__init__()

        self.messageList = []

    def addMessage(self, typeName, data):
        self.messageList.append("type": typeName,
                                 "data": data)

    def data(self, index, role):

        if not index.isValid():
            return None

        if role != QtCore.Qt.DisplayRole:
            return None

        item = self.messageList[index.row()]

        if index.column() == 0:
            return str(item["type"])
        else:
            return str(item["data"])

    def headerData(self, section, orientation, role):
        if orientation == QtCore.Qt.Horizontal:
            if role == QtCore.Qt.DisplayRole:
                if section == 0:
                    return "type"
                else:
                    return "data"

        return None

    def parent(self, index):
        if not index.isValid():
            return QtCore.QModelIndex()

        return QtCore.QModelIndex()

    def index(self, row, column, parent):
        if not self.hasIndex(row, column, parent):
            return QtCore.QModelIndex()
        else:
            return self.createIndex(row, column)

    def flags(self, index):
        if not index.isValid():
            return QtCore.Qt.NoItemFlags

        return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable

    def columnCount(self, parent):
        return 2

    def rowCount(self, parent):
        return len(self.messageList)


class FormMessageJournal(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.layout = QtWidgets.QVBoxLayout()

        self.messageTable = QtWidgets.QTableView(self)
        self.messageTable.clicked.connect(self.onClickedRow())
        self.messageList = Message()
        self.messageList.addMessage("Send", "Hello")
        self.messageList.addMessage("Send", "Hello")
        self.messageList.addMessage("Send", "Hello")
        self.messageList.addMessage("Send", "Hello")
        self.messageTable.setModel(self.messageList)
        self.layout.addWidget(self.messageTable)

        self.setLayout(self.layout)

    def onClickedRow(self, index=None):
        print("Click !")


if __name__ == "__main__":
    app = QtWidgets.QApplication([])

    widget = FormMessageJournal()
    widget.show()

    sys.exit(app.exec_())

只有我一个人有这种问题吗?

【问题讨论】:

【参考方案1】:
self.messageTable.clicked.connect(self.onClickedRow())

改为:

self.messageTable.clicked.connect(self.onClickedRow)

【讨论】:

以上是关于QTableView点击信号从未发出?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QTableView 中发出输入单元格和离开单元格的信号

Qt:在编辑 QTableView 项目数据时而不是在编辑完成后发出信号?

QTableView 没有行区的信号

QTableView排序信号?

Qt Qtableview没有得到标题项目点击的信号

发出 Qt 信号但从未调用过插槽