我使用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>
亲切的问候,马克西姆。
答案 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_()