QT / Python Type Casting

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Schlage mich schon den ganzen Tag damit herum, dieses kleine simple Programm zum Laufen zu bringen. Ich verzweifele an der Variable a. Scheint doch etwas anders zu sein als Delphi ;)

Programm

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys

from PyQt4.QtGui import QApplication
from PyQt4.uic import loadUi
from ctypes import *

def main():
    app = QApplication(sys.argv)
    window = loadUi("mainwindow.ui")  
    
    def calculate():
      a = window.progressBar.value  # <----- Das Problem
      print(a)
      window.progressBar.setValue(a)
   

    window.pushButton.clicked.connect(calculate)
    
    window.show()
    sys.exit(app.exec_())


      

    
if __name__ == '__main__':
  main()


Fehlermeldung

Code: Alles auswählen

<built-in method value of QProgressBar object at 0x7f05746e3e90>   ###<------ Ausgabe von print(a)
Traceback (most recent call last):
  File "./hello.py", line 17, in calculate
    window.progressBar.setValue(a)
TypeError: QProgressBar.setValue(int): argument 1 has unexpected type 'builtin_function_or_method'
Habe schon alles mögliche probiert. Wie greift man in QProgressBar auf value zu?
BlackJack

@hans: Das hat in diesem Fall überhaupt nichts mit Python zu tun, auch C++ muss man Methoden *aufrufen*. Die `print()`-Ausgabe verrät es im Grunde ja schon das Du da versuchst eine Methode als Zahlwert zu übergeben.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Tja, jetzt muss ich dumm fragen. Und was verwendet man statt value? Wie steuere ich den Fortschrittsbalken?

Wenn ich das ertse QT Element kapiert habe, wird es mit den folgenden hoffentlich leichter :-)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@hans: Das hat nichts mit Qt zu tun. Wie BlackJack schon schrieb, muss man Funktionen auch aufrufen. Schau her:

Code: Alles auswählen

In [1]: def foo():
   ...:     return 123
   ...: 

In [2]: foo
Out[2]: <function __main__.foo>

In [3]: foo()
Out[3]: 123
Das gleiche gilt natürlich auch für Methoden.
In specifications, Murphy's Law supersedes Ohm's.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

...... und schon geht die Sonne auf.

Aber jetzt einmal allgemein gefragt. In der Dokumentation QT 5.5 QProgressbar ist value als Property (value : int) aufgeführt und als publicFunction (int value() const). Ich sehe das richtig, dass ich nur die Elemente, welche auf public gesetzt sind, verfügen kann, egal um welche QT Klasse es sich auch handelt?

Ich schaffe das :-)
BlackJack

@hans: Hier liegt vielleicht ein Missverständnis mit C++ und Qt vor: C++ kennt keine Properties im Sinne von Delphi oder Python (oder Dart :-)). Wenn in der Qt-Dokumentation etwas von einem Property `foo` steht, dann ist damit effektiv gemeint es gibt eine `foo()`-Methode und eine `setFoo()`-Methode.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Erst einmal Danke an BlackJack und pillmuncher. So ist das eben wenn man "verbildet" ist. Aber wenn man lernt die Doku richtig zu lesen, dann wird es schon. Im Vergleich der Python Programmierung unter GIMP ist eine Python QT Anwendung ja noch einfach :-) <vielleicht hat mal jemand Lust, sich in GIMP mit den Vektoren (Pfaden) zu beschäftigen.
BlackJack

@hans: Sind die komplizierter als `QPainterPath`? :-)
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

@BlackJack
Ach, so etwas gibt es in QT auch? Also ich habe mich an die Dinger nie heran gewagt. Der Aufbau kann wie folgt beschrieben werden:

Gegeben sind zwei Punkte, verbunden durch einen Linie. Jeder Endpunkt der Linie hat einen Vektor, welcher frei um seinen Ausgangspunkt bewegt werden kann. Abstand und Winkel sind variabel und haben Auswirkung auf die Form der Linie.

Mit zwei Linien kann man z.B. einen Kreis definieren. Frage: Möglich dass so etwas in der Statik (Fachwerk) verwendet wird?
BlackJack

@hans: Kurven beim Fachwerk? Vielleicht wenn der Architekt besoffen war. ;-)

Verschiedene Kurven (Bezier, quadratische oder kubische Splines, …) sind eigentlich ziemlich normal in der Computergrafik. Jedes Vektorgrafikprogramm bietet so etwas und pixelorientierte wie Gimp meistens auch in irgendeiner Form, weil die halt sehr praktisch sind um geschwungene Linien/Pfade zeichnen zu können, die man nachträglich noch bearbeiten kann. Die entsprechen ungefähr den Kurvenlinealen mit denen man so etwas auf Papier machen kann/machte, nur ohne die Veränderungsmöglichkeiten. Radiergummi und neuzeichnen mal ausgenommen. ;-)
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Ich wusste es doch :-) Gleich der erste Versuch bei Google (Statik, Vektor) ergibt einen Treffer.

Die Anwendung in den Programmen wie GIMP ist für mich kein Problem, sondern nur die Programmierung. Vielleicht liegt es auch nur an der spartanischen Dokumentation.
Antworten