PyQt - Probleme mit QListViewItem

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Gast

Hallo,

ich versuche mich gerade in PyQt einzuarbeiten. Dabei bin ich auf folgendes Problem gestoßen: Ich möchte ein QListView benutzen, um komfortabel aus einer Liste (später evtl. auch Baum) einen Eintrag zu selektieren. In den einzelnen QListViewItems sollen deshalb Zusatzinformationen gespeichert werden, die dann später in editierbaren Feldern neben dem ListView angezeigt werden sollen. Dies ist an sich noch kein Problem und funzt so weit.

Nun soll man ja aber auch diese Daten editieren können. Wenn ich nun (wie in meinem kleinen Demo-Beispiel) über das Signal textChanged() eines QLineEdits den aktuellen Text in mein überschriebenes ListViewItem schreiben will, stürzt das Proggi ab! Warum?

Lustigerweise ja aber auch erst nach dem Schreibvorgang ...

Hier das Programm

Code: Alles auswählen

#! /usr/bin/python

import sys
from qt import *
from Test import Test

#
# MyListViewItem
#
class MyItem(QListViewItem):
	def __init__(self, parent,name):
		QListViewItem.__init__(self, parent,name)
		self.name=name

#
# Hauptfenster
#
class MainWindow(Test):
	def __init__(self,*args):
		apply(Test.__init__, (self,) + args)
		self.liste.insertItem(MyItem(self.liste,"Test1"))
		self.liste.insertItem(MyItem(self.liste,"Test2"))
		self.liste.insertItem(MyItem(self.liste,"Test3"))
		self.liste.insertItem(MyItem(self.liste,"Test4"))
		QObject.connect(self.text,SIGNAL("textChanged(const QString &)"),self.slotName)
		QObject.connect(self.liste,SIGNAL("currentChanged(QListViewItem *)"),self.slotShow)

	def slotShow(self,item):
		self.text.setText(item.name)

	def slotName(self,name):
		print "Vor dem Schreiben"
		self.liste.currentItem().name=name
		print "Nach dem Schreiben"

#
# Hauptprogramm
#
def main(args):
	app=QApplication(args)
	win=MainWindow()
	win.show()
	app.connect(app, SIGNAL("lastWindowClosed()"),app, SLOT("quit()"))
	app.exec_loop()

if __name__=="__main__":
	main(sys.argv)
und die GUI-Klasse

Code: Alles auswählen

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test1.ui'
#
# Created: Fr Sep 3 11:56:28 2004
#      by: The PyQt User Interface Compiler (pyuic) 3.11
#
# WARNING! All changes made in this file will be lost!


from qt import *


class Test(QDialog):
    def __init__(self,parent = None,name = None,modal = 0,fl = 0):
        QDialog.__init__(self,parent,name,modal,fl)

        if not name:
            self.setName("Test")


        TestLayout = QVBoxLayout(self,11,6,"TestLayout")

        self.liste = QListView(self,"liste")
        self.liste.addColumn(self.__tr("Column 1"))
        TestLayout.addWidget(self.liste)

        self.text = QLineEdit(self,"text")
        TestLayout.addWidget(self.text)

        self.languageChange()

        self.resize(QSize(228,285).expandedTo(self.minimumSizeHint()))
        self.clearWState(Qt.WState_Polished)


    def languageChange(self):
        self.setCaption(self.__tr("Form1"))
        self.liste.header().setLabel(0,self.__tr("Column 1"))


    def __tr(self,s,c = None):
        return qApp.translate("Test",s,c)
Ich habe schon auf etlichen Seiten im Netz gesucht, aber leider kein funktionierendes Beispiel gefunden, noch eine Erklärung, wie man das in dem konkreten fall QListViewItem genau machen muß.

Ich benutze Python 2.3.3 auf einer SuSE 9.1 Maschine.

Ich hoffe jemand weiß Rat und kann mir das Problem erklären / lösen!
Gast

Hallo,

es haben sich ja schon einige den Thread angesehen, aber noch nichts geschrieben ... daher eine weitere Bitte: Wer schon mal etwas ähnliches gemacht hat, könnte mir einfach mal die Sourcen hier posten oder einen Link dazu angeben; auch über einen Link, wo zu diesem Thema etwas gesagt wird, wäre ich dankbar.

Ich habe mir noch einmal die Demo-Scripte von PyQt angesehen - aber da wird imho nur in einem ein QListViewItem abgeändert und dann leider nicht editierbar gemacht ... insofern nützt mir das leider nichts. Ode rhabe ich da evtl. etwas interessantes übersehen?
Gast

Hm ... hier scheint ja nicht viel los zu sein ... :(

Naja, ich werde jedenfalls weiterhin nachsehen, ob nicht doch noch jemand Rat weiß ...
Gast

Arbeitet denn niemand mit QListViews??? Das kann doch gar nicht sein ...
DER Olf
User
Beiträge: 283
Registriert: Mittwoch 24. Dezember 2003, 19:32

es gibt leider sehr wenige hier, die PyQt verwenden. *schnief*

aber was wichtiger ist: was ist dein fehler?
paste mal hier.

mfg Olf
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi,

ja leider sind hier noch kaum Leute, die mit Qt arbeiten. Ich selber habs nichtmal installiert. Eines fällt mir auf was du noch überprüfen könntest.
Ich gehe mal davon aus, daß der Fehler in der Methode slotName auftritt, hat denn name auch den richtigen Typ für die Zuweisung zu listitem.name?

Code: Alles auswählen

    def slotName(self,name):
        print "Vor dem Schreiben"
        print "Der Typ von Listitem.name ist " + type(self.liste.currentItem().name)
        print "Det Typ von Name ist " + type(name)
        self.liste.currentItem().name=name
        print "Nach dem Schreiben"
Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Ich hab leider auch keine Ahnung von PyQt, aber Dookie hat irgendwie recht gehabt :D

Code: Alles auswählen

self.liste.currentItem().name = str(name)
So funktionierts bei mir.

Gruß, mawe
Gast

Hey, danke Euch!!!

Stimmt, wenn man "name" explizit in einen String castet, dann funzt es. Ist mir zwar ein Rätsel, warum es vorher kein String sein soll, aber was solls.

Schade, daß nicht mehr Leute mit Qt arbeiten. Unter C++ ist es mein Lieblings Toolkit.

Ciao
BSimpson

Das casten von name ist notwendig, da du ein QString object bekommst. Du kannst aber auch die methode ascii() verwenden um einen string zu bekommen, sprich name = text.text().ascii(). Andere sache die mir aufgefallen ist, wie handled dein programm denn den textchange, des lineedit's, wenn du das erste item wählst, denn da ist ja noch nichts ausgewählt, und currentitem nicht gesetzt. Es sollte jedoch ein textchange erfolgen, da du ja beim ersten anclicken eines items den namen in das lineedit schreibst. Hatte da auch schon einige probleme mit, und musste diese ausnahmen gesondert berücksichtigen.
Gast

Hallo mal wieder,

danke für Deine Tipps. Ja, ich habe in der Tat an einige solcher "speziellen" Fälle nicht gedacht. Ich werde demnächst mal wieder an dem Programm arbeiten und daran denken.

Ciao
Antworten