2017-01-19 8 views
0

Я использую QTreeView в качестве вида и QAbstractItemModel как модель. Это как мое приложение ищет прямо сейчас: Можно ли сделать один элемент в QTreeView кликабельным?

Я хочу, чтобы это поле (URL-адрес) на вид справа Clickable, не редактируемые, так что пользователь может щелкнуть по нему и открыть ссылку.

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

QTreeView находится на левой стороне, поле URL находится на правой стороне в QTableView. Вы хотите, чтобы можно было щелкнуть по полю в QTableView, не так ли? – Trilarion

+0

Прости, я пропустил это. Оба они являются QTreeView. –

ответ

1

Первое, что мы делаем это отключить редактирование элементов с

{your treeview}.setEditTriggers(QAbstractItemView.NoEditTriggers) 

Затем мы подключаем Clicked событие в слот (в моем случае on_clicked), из QModelIndex мы получаем деталь, и, следовательно, текст, связанный с последним, мы затем запустить открытие 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

+0

Интересное решение, спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^