отображать выбранные элементы QListView [duplicate]

Определение пространств имен в XPath (рекомендуется)

У самого XPath нет способа связать префикс пространства имен с пространством имен. Такие средства предоставляются библиотекой хостинга.

Рекомендуется использовать эти средства и определять префиксы пространства имен, которые затем могут использоваться для квалифицирования XML-элементов и имен атрибутов по мере необходимости.


Вот некоторые из различных механизмов, которые хосты XPath предоставляют для указания привязок префикса пространства имен к URI пространства имен:

XSLT:


   ...

Perl ( LibXML ):

my $xc = XML::LibXML::XPathContext->new($doc);
$xc->registerNs('i', 'http://schema.intuit.com/finance/v3');
my @nodes = $xc->findnodes('/i:IntuitResponse/i:QueryResponse');

Python ( lxml ):

from lxml import etree
f = StringIO('...')
doc = etree.parse(f)
r = doc.xpath('/i:IntuitResponse/i:QueryResponse', 
              namespaces={'i':'http://schema.intuit.com/finance/v3'})

Python ( ElementTree ):

namespaces = {'i': 'http://schema.intuit.com/finance/v3'}
root.findall('/i:IntuitResponse/i:QueryResponse', namespaces)

Java (SAX):

NamespaceSupport support = new NamespaceSupport();
support.pushContext();
support.declarePrefix("i", "http://schema.intuit.com/finance/v3");

Java (XPath):

xpath.setNamespaceContext(new NamespaceContext() {
    public String getNamespaceURI(String prefix) {
      switch (prefix) {
        case "i": return "http://schema.intuit.com/finance/v3";
        // ...
       }
    });

C #:

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("i", "http://schema.intuit.com/finance/v3");
XmlNodeList nodes = el.SelectNodes(@"/i:IntuitResponse/i:QueryResponse", nsmgr);

xmlstarlet:

-N i="http://schema.intuit.com/finance/v3"

JavaScript:

См. Реализация разрешенного пользователем пространства имен Resolver :

function nsResolver(prefix) {
  var ns = {
    'i' : 'http://schema.intuit.com/finance/v3'
  };
  return ns[prefix] || null;
}
document.evaluate( '/i:IntuitResponse/i:QueryResponse', 
                   document, nsResolver, XPathResult.ANY_TYPE, 
                   null );

PhP :

Адаптировано из @ ответа Томалака с использованием DOMDocument :

$result = new DOMDocument();
$result->loadXML($xml);

$xpath = new DOMXpath($result);
$xpath->registerNamespace("i", "http://schema.intuit.com/finance/v3");

$result = $xpath->query("/i:IntuitResponse/i:QueryResponse");

См. также @ Канонический Q / A IMSoP на PHP Пространства имен SimpleXML .

VBA:

xmlNS = "xmlns:i='http://schema.intuit.com/finance/v3'"
doc.setProperty "SelectionNamespaces", xmlNS  
Set queryResponseElement =doc.SelectSingleNode("/i:IntuitResponse/i:QueryResponse")

Как только вы объявили префикс пространства имен, ваш XPath можно записать, чтобы использовать его:

/i:IntuitResponse/i:QueryResponse

Поражение пространств имен в XPath (не рекомендуется)

Альтернативой является запись предикатов, которые проверяют на local-name():

/*[local-name()='IntuitResponse']/*[local-name()='QueryResponse']/@startPosition

Или, в XPath 2.0:

/*:IntuitResponse/*:QueryResponse/@startPosition

Пространство имен в этом стиле работает, но не рекомендуется, потому что оно

  • Под-указывает полное имя элемента / атрибута.
  • Не удается различать имена элементов / атрибутов в разных пространствах имен (сама цель пространств имен). Обратите внимание, что эту проблему можно решить, добавив дополнительный предикат, чтобы проверить URI пространства имен явно1:
    /*[    namespace-uri()='http://schema.intuit.com/finance/v3' 
       and local-name()='IntuitResponse']
    /*[    namespace-uri()='http://schema.intuit.com/finance/v3' 
       and local-name()='QueryResponse']
    /@startPosition
    
    1Подается Даниэль Хейли для примечания namespace-uri().
  • Является чрезмерно подробным .
0
задан answerSeeker 28 December 2016 в 08:21
поделиться

2 ответа

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class AppRemovalPage(QtGui.QWizardPage):
    def __init__(self, parent=None):
        super(AppRemovalPage, self).__init__(parent=parent)
        self.setTitle('Apps to Remove')
        self.setSubTitle('Listview')
        self.list_view = QtGui.QListView(self)
        self.list_view.setMinimumSize(465, 200)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.list_view)
        self.setLayout(layout)
        self.items = []
        self.isWritten = False

        loo = "/home/test1/file.txt"

        self.model = QtGui.QStandardItemModel(self.list_view)

        self.model.itemChanged.connect(self.setItems)

        file = QtCore.QFile(loo)
        if file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
            while not file.atEnd():
                line = bytearray(file.readLine()).decode().strip()
                item = QtGui.QStandardItem(line)
                item.setCheckable(True)
                item.setCheckState(QtCore.Qt.Unchecked)
                self.model.appendRow(item)
        self.list_view.setModel(self.model)
        self.list_view.show()

    def setItems(self, item):
        if item.checkState() == QtCore.Qt.Checked:
            self.items.append(item)
        if item.checkState() == QtCore.Qt.Unchecked:
            self.items.remove(item)

    def print_checked_items(self):
        path = "/home/test1/checked.txt"
        mode = QtCore.QFile.Append if self.isWritten else QtCore.QFile.WriteOnly
        if len(self.items) > 0:
            file = QtCore.QFile(path)
            if file.open(mode):
                for item in self.items:
                    print('%s' % item.text())
                    file.write(item.text() + "\n")
            file.close()
        print("print checked items executed")

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    wizard = QtGui.QWizard()

    appremoval = AppRemovalPage()
    wizard.addPage(appremoval)
    wizard.addPage(QtGui.QWizardPage())

    wizard.button(QtGui.QWizard.NextButton).clicked.connect(appremoval.print_checked_items)
    wizard.show()
    sys.exit(app.exec_())

Выход:

a
d
e
print checked items executed
2
ответ дан eyllanesc 18 August 2018 в 21:06
поделиться
  • 1
    Еще раз спасибо, ты лучший! Мне просто пришлось сменить file.write(item.text()) на `file.write ('% s\n'% item.text ())`, чтобы он работал. Думаю, я должен был использовать QtCore.QFile. для записи файлов – answerSeeker 28 December 2016 в 08:39
  • 2
    @TatakaiWasumi обновляет мое решение – eyllanesc 28 December 2016 в 09:05
  • 3
    Вы должны отдавать предпочтение классам Python, если вам не нужны конкретные возможности из класса Qt. В вашем коде файловый объект Python работает так же хорошо, см. Мой обновленный ответ. Кроме того, лямбда не нужна. – Oliver 28 December 2016 в 15:04
  • 4
    @Schollii Чтобы отдавать предпочтение или нет функции или другой, если они выполняют одну и ту же задачу, это что-то мелочи, но мне нравится работать с одной библиотекой. Точно, лямбда-функция не требовалась. Ваш ответ не лучше и не хуже моего. Спасибо за замечания. – eyllanesc 28 December 2016 в 16:29
  • 5
    @eyllanesc Chill bro ', я никогда не говорил, что мой ответ был лучше. Я просто указывал на некоторые лучшие практики, которые принимаются в сообществе PyQt для Tatakai, который только учится. Некоторые люди здесь, чтобы погладить свое эго, но многие (возможно, большинство) находятся здесь, чтобы помочь другим, поэтому расслабьтесь и дайте людям возможность сомневаться. – Oliver 28 December 2016 в 16:57

Когда я запускаю это в Python 3.5 и PyQt5, он отлично работает, он печатает правильные режимы и отмеченные элементы. Я удалил строки для чтения / записи файлов для тестирования. Для PyQt4 и Python 2.7 вам просто нужно исправить пару импортных операций и инструкцию печати. Запустите его, отметьте пару элементов, и через 5 секунд что вы видите на консоли?

from PyQt5 import QtCore

from PyQt5 import QtGui
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication, QWizardPage, QListView


class AppRemovalPage(QWizardPage):
    def __init__( self, parent ):
        super(AppRemovalPage, self).__init__(parent)
        self.setTitle('Apps to Remove')
        self.setSubTitle('Listview')
        self.list_view = QListView(self)
        self.list_view.setMinimumSize(465, 200)
        self.isWritten = False
        loo = "/home/test1/file.txt"

        self.model = QtGui.QStandardItemModel(self.list_view)
        for line in ('a', 'b', 'c', 'd', 'e'):
            self.item = QtGui.QStandardItem(line)
            self.item.setCheckable(True)
            self.item.setCheckState(QtCore.Qt.Unchecked)
            self.model.appendRow(self.item)

        self.list_view.setModel(self.model)
        self.list_view.show()


    def print_checked_items(self):
        for index in range(self.model.rowCount()):
            item = self.model.item(index)
            if item.checkState() == QtCore.Qt.Checked:
                if self.isWritten:
                    mode = "a"
                else:
                    mode = "w"
                    self.isWritten = True
                print ('%s' % item.text())

        print("print checked items executed")


app = QApplication([])
listview = AppRemovalPage(None)
listview.show()
QTimer.singleShot(5000, listview.print_checked_items)
app.exec_()

Если у меня есть галочка a, c и d, я вижу следующее:

a w
c a
d a
print checked items executed

Обновить, чтобы показать, как работает файловый объект Python (и на самом деле это лучший код, потому что он поддерживает использование управления контекстом):

def print_checked_items(self):
    path = "checked.txt"
    mode = 'a' if self.isWritten else 'w'
    if len(self.items) > 0:
        with open(path, mode) as file:
            for item in self.items:
                print('%s' % item.text())
                file.write(item.text() + "\n")
        file.close()
    print("print checked items executed")

Соединение можно записать wizard.button(QWizard.NextButton).clicked.connect(appremoval.print_checked_items)

4
ответ дан Oliver 18 August 2018 в 21:06
поделиться
  • 1
    Он работает, но я пытаюсь создать файл, и он ничего не печатает, кроме как «напечатанные проверенные элементы». Вот что меня озадачивает – answerSeeker 28 December 2016 в 08:04
  • 2
    @TatakaiWasumi Итак, ваш вопрос не имеет ничего общего с PyQt, это чистая проблема Python. Я обновил свой ответ, несмотря на то, что еще один уже принят, чтобы показать, что QFile не требуется (по крайней мере, работал на платформе Python 3.5 / PyQt 5.5 / Windows 7). – Oliver 28 December 2016 в 15:08
Другие вопросы по тегам:

Похожие вопросы: