是否可以在QTreeView中使一个项目可点击?

时间:2017-01-19 13:55:59

标签: python python-3.x pyqt qt5 pyqt5

我使用QTreeView作为视图,使用QAbstractItemModel作为模型。 这就是我的应用现在的样子:

我想在右侧视图中点击该字段( url ),而不是可编辑的,因此用户可以点击它并打开网址。

XML:

<?xml version="1.0" encoding="utf-8"?>
<ModMetaData>
  <name>Hospitality</name>
  <author>Orion</author>
  <url>https://ludeon.com/forums/index.php?topic=11444.0</url>
  <targetVersion>0.14.1241</targetVersion>
</ModMetaData>

亲切的问候,马克西姆。

1 个答案:

答案 0 :(得分:1)

我们要做的第一件事就是禁止使用

编辑项目
{your treeview}.setEditTriggers(QAbstractItemView.NoEditTriggers)

然后我们将点击的事件连接到一个插槽(在我的情况下是on_clicked),从QModelIndex我们得到Item,然后是与后者关联的文本,然后我们用以下内容启动打开的Url:

QDesktopServices.openUrl(QUrl({your url}))

完整代码:

import sys

from PyQt5.QtCore import QFile, QIODevice, QUrl
from PyQt5.QtGui import QDesktopServices, QStandardItem, QStandardItemModel
from PyQt5.QtWidgets import QAbstractItemView, QApplication, QTreeView
from PyQt5.QtXml import QDomDocument


class CustomTreeView(QTreeView):
    def __init__(self, parent=None):
        super(CustomTreeView, self).__init__(parent=parent)

        self.mdl = QStandardItemModel()
        self.mdl.setHorizontalHeaderLabels(["tag", "value"])
        self.setModel(self.mdl)
        self.readXML('item.xml')
        self.clicked.connect(self.on_clicked)
        self.setEditTriggers(QAbstractItemView.NoEditTriggers)

    def on_clicked(self, index):
        text = self.mdl.itemFromIndex(index).text()
        QDesktopServices.openUrl(QUrl(text))

    def readXML(self, filename):
        doc = QDomDocument("doc")
        file = QFile(filename)
        if not file.open(QIODevice.ReadOnly):
            return
        if not doc.setContent(file):
            file.close()
            return
        file.close()

        rootNode = self.mdl.invisibleRootItem()

        docElem = doc.documentElement()
        node = docElem.firstChild()
        while not node.isNull():
            element = node.toElement()
            if not element.isNull():
                tag = QStandardItem(element.tagName())
                value = QStandardItem(element.text())
                # tag.setEditable(False)
                # value.setEditable(False)
                rootNode.appendRow([tag, value])
            node = node.nextSibling()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = CustomTreeView()
    w.show()
    app.exec_()

enter image description here