2017-01-19 10 views
0

Ich verwende QTreeView als Ansicht und QAbstractItemModel als Modell. Dies ist, wie mein App jetzt suchen: Ist es möglich, ein Element in QTreeView anklickbar zu machen?

ich dieses Feld machen will (url) auf der rechten Ansicht anklickbar, nicht bearbeitet werden, so können diese an und URL öffnen Benutzer klicken.

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> 

Mit freundlichen Grüßen, Maxim.

+0

Die QTreeView auf der linken Seite ist, ist das Feld URL auf der rechten Seite in der QTableView. Sie möchten es ermöglichen, auf ein Feld in einer QTableView zu klicken, oder? – Trilarion

+0

Entschuldigung, das habe ich verpasst. Beide sind QTreeView. –

Antwort

1

Das erste, was wir tun, ist die Bearbeitung der Elemente deaktivieren mit

{your treeview}.setEditTriggers(QAbstractItemView.NoEditTriggers) 

Dann haben wir das Klickereignis zu einem Schlitz (in meinem Fall on_clicked) verbinden, aus dem QModelIndex wir den Artikel erhalten, und folglich der Text mit diesem verbunden sind, starten wir dann die Öffnung URL mit:

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

komplette Code:

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

+0

Interessante Lösung, danke :) –

Verwandte Themen