PyQt - Probleme mit QListViewItem

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

PyQt - Probleme mit QListViewItem

Beitragvon Gast » Freitag 3. September 2004, 11:10

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

Beitragvon Gast » Freitag 3. September 2004, 14:17

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

Beitragvon Gast » Dienstag 7. September 2004, 16:26

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

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

Beitragvon Gast » Donnerstag 28. Oktober 2004, 10:40

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

Beitragvon DER Olf » Donnerstag 28. Oktober 2004, 10:51

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

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

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

Beitragvon Dookie » Donnerstag 28. Oktober 2004, 12:16

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: Alles auswählen

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

Beitragvon mawe » Donnerstag 28. Oktober 2004, 16:31

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

Beitragvon Gast » Donnerstag 4. November 2004, 13:27

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

Casting und andere Probleme

Beitragvon BSimpson » Montag 8. November 2004, 07:19

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

Beitragvon Gast » Sonntag 21. November 2004, 15:29

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder