Seite 1 von 1

PyQt - Probleme mit QListViewItem

Verfasst: Freitag 3. September 2004, 11:10
von 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!

Verfasst: Freitag 3. September 2004, 14:17
von 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?

Verfasst: Dienstag 7. September 2004, 16:26
von Gast
Hm ... hier scheint ja nicht viel los zu sein ... :(

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

Verfasst: Donnerstag 28. Oktober 2004, 10:40
von Gast
Arbeitet denn niemand mit QListViews??? Das kann doch gar nicht sein ...

Verfasst: Donnerstag 28. Oktober 2004, 10:51
von DER Olf
es gibt leider sehr wenige hier, die PyQt verwenden. *schnief*

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

mfg Olf

Verfasst: Donnerstag 28. Oktober 2004, 12:16
von Dookie
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

Verfasst: Donnerstag 28. Oktober 2004, 16:31
von mawe
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

Verfasst: Donnerstag 4. November 2004, 13:27
von 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

Casting und andere Probleme

Verfasst: Montag 8. November 2004, 07:19
von 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.

Verfasst: Sonntag 21. November 2004, 15:29
von 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