• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Einstieg in KDE GUI-Programmierung

hallo community,
ich habe einige jahrzehnte ANSI C Programmierung für Microcontroller gemacht
und möchte jetzt gern den Einstieg in die GUI-Programmierung unter KDE 4 finden.
Dabei schweben mir im Moment kleine Toolprogramm mit grafischer Bedienoberfläche vor.

Was für welche Entwicklungswerkzeuge würdet Ihr mir zum Einstieg empfehlen ?
Welche Begleitliteratur ist hierbei empfehlenswert ?

Ich habe ja eine Vorliebe für den Qt-Designer !

Über einen Tipp von Euch würde ich mich sehr freuen.
Vielen Dank.

viele grüsse aus dem adventlichen Oberbayern
vom bayernherz :roll:
 

abgdf

Guru
bayernherz schrieb:
Ich habe ja eine Vorliebe für den Qt-Designer !
Ist ja auch so ziemlich das Einzige, was es da gibt.
Mußt' halt das Tutorial durcharbeiten.
Die Sache mit dem Mainloop bei GUI-Programmen ist bekannt? Es hilft auch, OOP zu verstehen. In Bezug auf C bedeutet das den Umstieg auf C++.

Ich empfehle ja Python. Es gibt eine Brücke zu Qt. Die Entwicklung geht wesentlich einfacher und schneller als in C/C++, der Code ist eben ein bißchen langsamer in der Ausführung.
Sinnvoll ist auch, erstmal einen Prototyp in Python/PyQt zu schreiben und wenn einem das Ergebnis von der Geschwindigkeit nicht ausreichen sollte, den Code dann nach C++ zu übersetzen.

Code schreibe ich in der Konsole (genauer in xterm, wobei ich die Fonts (terminus-Font) auf eine angenehme Größe konfiguriert habe) mit einem guten Editor, sprich vim oder emacs. In meinem Fall ist es vim. Hat eine gewisse Lernkurve, lohnt sich aber. IDEs sind was für Windows. :mrgreen:

Am Ende, wenn man alles gut beherrscht, ist es wahrscheinlich auch besser, nicht den Code zu übernehmen, den Qt-Designer ausspuckt, sondern auch den GUI-Code selbst von Hand zu schreiben oder zumindest anzupassen.

Vielleicht sollte ich noch sagen: Die kleinen Tools, die ich schreibe, brauchen eigentlich kein großes Toolkit wie Qt, aber sie sollen leicht sowohl unter Linux als auch unter Windows laufen. Qt ist daher für mich nicht das Richtige (obwohl ich's mal ausprobiert hab), meine Wahl ist stattdessen Python/Tkinter.
Tk-Oberflächen gelten zwar als häßlich, aber das müssen sie nicht unbedingt sein, wenn man nur die Fonts anständig konfiguriert. Ansonsten brauche ich nicht Schicki-Lacki, sondern es soll mit wenig Aufwand plattformübergreifend funktionieren.

Fatal war bei Qt z.B., daß die Qt3-Programme nicht mit Qt4 liefen. Wenn Du jetzt also Qt4-Programme schreibst, und dann Qt5 kommt und das wieder so sein sollte, darfst Du nochmal alles neu schreiben. Na, schönen Dank auch.
 
OP
B

bayernherz

Hacker
hallo abgdf,
vielen Dank für Deine Antwort.
Ich denke Python kommt für mich nicht in Frage.
Fatal war bei Qt z.B., daß die Qt3-Programme nicht mit Qt4 liefen.
Wenn Du jetzt also Qt4-Programme schreibst, und dann Qt5 kommt
und das wieder so sein sollte, darfst Du nochmal alles neu schreiben
Das ist natürlich schon ein Trauerspiel ! :???:
Ich habe bereits ein bischen mit KDevelopment und Qt-Designer nach
trail and error herumgefummelt.
Es ist mir bereits gelungen ein GUI Design aufzusetzen zu übersetzen und
laufen zu lassen. Es gelingt mir aber nicht die Sache mit den Signalen u. Slots in den Griff zu bekommen.
Es sind einfach keine Funktionsrümpfe, wie ich es von MS Visual Studio her kenne
zu finden. Ich habe den Eindruck bei KDevelopment und dem QT-Designer passt irrgent etwas nicht zusammen.
Oder mache ich etwas graviert falsch.
Fazit:
Deshalb möchte ich gern mit dem Qt-Creater u. dem Qt-Designer arbeiten.
Kenne mich da aber überhaupt nicht aus! :???:

Vielleicht kann mir da jemand weiterhelfen. :roll:

viele grüsse aus dem vorweihnachtlichen Oberbayern
vom bayernerz
 

abgdf

Guru
http://www.youtube.com/watch?feature=player_detailpage&v=GLqrzLIIW2E#t=276

Das mit dem Slot macht er so:
http://www.youtube.com/watch?feature=player_detailpage&v=GLqrzLIIW2E#t=902
Dürfte in C++ ähnlich sein, nur komplizierter.
 
OP
B

bayernherz

Hacker
hallo abgdf ,
vielen Dank für Deine Links.
Ich habe mir die Videos noch nicht angesehen; Morgen!
Gehe mal davon aus, das bei Python u. C++ die Handhabung von Signalen u. Slots gleich gehandhabt wird.

Würde mich freuen, wenn Du noch einen Link mit einem Beispiel dazu oder eine entsprechende
Doku dazu hättest.
Und was hälst Du von der Verwendung von
Qt Creater u. Qt Designer
oder
KDevelop u. Qt Designer

Python kommt für mich nicht so infrage!

Würde mich über einen entsprechenden Hinweis von Dir sehr freuen.

viele grüsse aus dem abendlichen Oberbayern
vom bayernherz :roll:
 

abgdf

Guru
In C++ wird die Sache wie schon vermutet sehr kompliziert.
Dieses Beispiel läuft bei mir (kompiliert und läuft), und das müßte man wohl wirklich durcharbeiten:

http://doc.qt.digia.com/4.6/designer-calculatorform.html

Also: Qt-Designer spuckt einem eine XML-Datei aus, mit der Endung .ui.
Dann hätte man also "calculatorform.ui", auch hier. Die könnte man von Hand in eine ui_xxx.h-Datei umwandeln:
Code:
uic calculatorform.ui > ui_calculatorform.h
Kann man sich mal ansehen.
Für das Programm braucht man aber noch weitere Dateien, nämlich:
Code:
main.cpp
calculatorform.cpp
calculatorform.h
Die sind dort auf der Seite, den Inhalt sollte man verstehen. So, wenn man diese Dateien hat, kann man Folgendes machen:
1.
Code:
qmake -project
Das erzeugt einem eine (weitere) Datei "calculatorform.pro". Diese Datei editiert man und fügt darin die Zeile
Code:
FORMS       = calculatorform.ui
hinzu. Das bewirkt, daß im nachfolgenden Build-Prozeß automatisch aus "calculatorform.ui" die obige "ui_calculatorform.h" erzeugt und eingebunden wird (die eigene von oben kann man dann löschen).
2.
Code:
qmake
Dies erzeugt aus den Dateien, insbesondere aus der .pro-Datei, das für den Build-Prozeß nötige "Makefile".
3.
Code:
make
Nun sollte das Kompilieren durchlaufen, und am Ende ein ausführbares Programm "calculatorform" erzeugt worden sein.

Wie das nun mit den Slots innerhalb des Programms ist, muß man sich eben am Source-Code ansehen. Für C++-Programmierer dürfte das kein Problem sein, die haben das ja so gewollt, mir ist das zu nervtötend.

Ansonsten kannst Du auch hier mal fragen.
 

abgdf

Guru
Zum Vergleich PyQt:
Installiert müssen sein (wie immer, wenn man irgendwas in PyQt entwickeln will): Qt, Qt-Devel, Python, PyQt.
Ausgangspunkt ist wieder die mit dem Qt-Designer erzeugte XML-Datei calculatorform.ui.
Die kann man in Python-Code umwandeln mit "pyuic.py":
Code:
python /usr/lib/python/site-packages/PyQt4/uic/pyuic.py calculatorform.ui
Zu dem Output fügt man noch die Sachen aus dem Video hinzu, sowie die Slot-Sachen (die in C++ oben "calculatorform.cpp") macht. Dann sieht das Skript so aus:
Code:
#!/usr/bin/env python

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

# Form implementation generated from reading ui file 'calculatorform.ui'
#
# Created by: PyQt4 UI code generator 4.8.5
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui
import sys

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s


class Ui_CalculatorForm(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)

    def setupUi(self, CalculatorForm):
        CalculatorForm.setObjectName(_fromUtf8("CalculatorForm"))
        CalculatorForm.resize(400, 300)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Policy(5), QtGui.QSizePolicy.Policy(5))
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(CalculatorForm.sizePolicy().hasHeightForWidth())
        CalculatorForm.setSizePolicy(sizePolicy)
        CalculatorForm.setWindowTitle(QtGui.QApplication.translate("CalculatorForm", "Calculator Form", None, QtGui.QApplication.UnicodeUTF8))
        self.gridlayout = QtGui.QGridLayout(CalculatorForm)
        self.gridlayout.setMargin(9)
        self.gridlayout.setSpacing(6)
        self.gridlayout.setObjectName(_fromUtf8("gridlayout"))
        spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.gridlayout.addItem(spacerItem, 0, 6, 1, 1)
        self.label_3_2 = QtGui.QLabel(CalculatorForm)
        self.label_3_2.setGeometry(QtCore.QRect(169, 9, 20, 52))
        self.label_3_2.setText(QtGui.QApplication.translate("CalculatorForm", "=", None, QtGui.QApplication.UnicodeUTF8))
        self.label_3_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3_2.setObjectName(_fromUtf8("label_3_2"))
        self.gridlayout.addWidget(self.label_3_2, 0, 4, 1, 1)
        self.vboxlayout = QtGui.QVBoxLayout()
        self.vboxlayout.setMargin(1)
        self.vboxlayout.setSpacing(6)
        self.vboxlayout.setObjectName(_fromUtf8("vboxlayout"))
        self.label_2_2_2 = QtGui.QLabel(CalculatorForm)
        self.label_2_2_2.setGeometry(QtCore.QRect(1, 1, 36, 17))
        self.label_2_2_2.setText(QtGui.QApplication.translate("CalculatorForm", "Output", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2_2_2.setObjectName(_fromUtf8("label_2_2_2"))
        self.vboxlayout.addWidget(self.label_2_2_2)
        self.outputWidget = QtGui.QLabel(CalculatorForm)
        self.outputWidget.setGeometry(QtCore.QRect(1, 24, 36, 27))
        self.outputWidget.setFrameShape(QtGui.QFrame.Box)
        self.outputWidget.setFrameShadow(QtGui.QFrame.Sunken)
        self.outputWidget.setText(QtGui.QApplication.translate("CalculatorForm", "0", None, QtGui.QApplication.UnicodeUTF8))
        self.outputWidget.setAlignment(QtCore.Qt.AlignAbsolute|QtCore.Qt.AlignBottom|QtCore.Qt.AlignCenter|QtCore.Qt.AlignHCenter|QtCore.Qt.AlignHorizontal_Mask|QtCore.Qt.AlignJustify|QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignRight|QtCore.Qt.AlignTop|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter|QtCore.Qt.AlignVertical_Mask)
        self.outputWidget.setObjectName(_fromUtf8("outputWidget"))
        self.vboxlayout.addWidget(self.outputWidget)
        self.gridlayout.addLayout(self.vboxlayout, 0, 5, 1, 1)
        spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.gridlayout.addItem(spacerItem1, 1, 2, 1, 1)
        self.vboxlayout1 = QtGui.QVBoxLayout()
        self.vboxlayout1.setMargin(1)
        self.vboxlayout1.setSpacing(6)
        self.vboxlayout1.setObjectName(_fromUtf8("vboxlayout1"))
        self.label_2 = QtGui.QLabel(CalculatorForm)
        self.label_2.setGeometry(QtCore.QRect(1, 1, 46, 19))
        self.label_2.setText(QtGui.QApplication.translate("CalculatorForm", "Input 2", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.vboxlayout1.addWidget(self.label_2)
        self.inputSpinBox2 = QtGui.QSpinBox(CalculatorForm)
        self.inputSpinBox2.setGeometry(QtCore.QRect(1, 26, 46, 25))
        self.inputSpinBox2.setObjectName(_fromUtf8("inputSpinBox2"))
        self.vboxlayout1.addWidget(self.inputSpinBox2)
        self.gridlayout.addLayout(self.vboxlayout1, 0, 3, 1, 1)
        self.label_3 = QtGui.QLabel(CalculatorForm)
        self.label_3.setGeometry(QtCore.QRect(63, 9, 20, 52))
        self.label_3.setText(QtGui.QApplication.translate("CalculatorForm", "+", None, QtGui.QApplication.UnicodeUTF8))
        self.label_3.setAlignment(QtCore.Qt.AlignCenter)
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.gridlayout.addWidget(self.label_3, 0, 1, 1, 1)
        self.vboxlayout2 = QtGui.QVBoxLayout()
        self.vboxlayout2.setMargin(1)
        self.vboxlayout2.setSpacing(6)
        self.vboxlayout2.setObjectName(_fromUtf8("vboxlayout2"))
        self.label = QtGui.QLabel(CalculatorForm)
        self.label.setGeometry(QtCore.QRect(1, 1, 46, 19))
        self.label.setText(QtGui.QApplication.translate("CalculatorForm", "Input 1", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setObjectName(_fromUtf8("label"))
        self.vboxlayout2.addWidget(self.label)
        self.inputSpinBox1 = QtGui.QSpinBox(CalculatorForm)
        self.inputSpinBox1.setGeometry(QtCore.QRect(1, 26, 46, 25))
        self.inputSpinBox1.setObjectName(_fromUtf8("inputSpinBox1"))
        self.vboxlayout2.addWidget(self.inputSpinBox1)
        self.gridlayout.addLayout(self.vboxlayout2, 0, 0, 1, 1)

        self.retranslateUi(CalculatorForm)
        QtCore.QMetaObject.connectSlotsByName(CalculatorForm)

    def retranslateUi(self, CalculatorForm):
        pass

class CalculatorForm(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.ui = Ui_CalculatorForm()
        self.ui.setupUi(self)
    @QtCore.pyqtSlot(int)
    def on_inputSpinBox1_valueChanged(self, value):
        self.ui.outputWidget.setText(str(value + self.ui.inputSpinBox2.value()))
    @QtCore.pyqtSlot(int)
    def on_inputSpinBox2_valueChanged(self, value):
        self.ui.outputWidget.setText(str(value + self.ui.inputSpinBox1.value()))

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    calculator = CalculatorForm()
    calculator.show()
    sys.exit(app.exec_())
Läuft. Wesentlich einfacher, um Faktor 5 würde ich sagen.
 

abgdf

Guru
Und zum Vergleich nochmal in Python/Tkinter:
Code:
#!/usr/bin/env python
# coding: iso-8859-1

import Tkinter as tk

class myWindow:

    def __init__(self):

        self.mw = tk.Tk()
        self.mw.option_add("*font", ("Sans Serif", 15, "normal"))
        self.mw.geometry("+158+190")
        self.mw.title("Calculator Form")

        self.result = tk.Variable()
        self.fr1 = tk.Frame(self.mw)
        self.fr1lab = tk.Label(self.fr1, text = "Input 1")
        self.spb1 = tk.Spinbox(self.fr1, from_=0, to=99,
                               width = 3,
                               command = self.updateResult)
        self.fr2 = tk.Frame(self.mw)
        self.fr2lab = tk.Label(self.fr2, text = "Input 2")
        self.spb2 = tk.Spinbox(self.fr2, from_=0, to=99,
                               width = 3,
                               command = self.updateResult)
        self.fr1.pack(side = tk.LEFT, padx = 20, pady = 30)
        self.pllab = tk.Label(self.mw, text = "+")
        self.fr1lab.pack()
        self.spb1.pack()
        self.pllab.pack(side = tk.LEFT)
        self.fr2.pack(side = tk.LEFT, padx = 20)
        self.fr2lab.pack()
        self.spb2.pack()
        self.gllab = tk.Label(self.mw, text = "=")
        self.gllab.pack(side = tk.LEFT)
        self.fr3 = tk.Frame(self.mw)
        self.fr3lab = tk.Label(self.fr3, text = "Output")
        self.outlab = tk.Label(self.fr3,
                               relief = tk.RIDGE,
                               borderwidth = 2,
                               textvariable = self.result)
        self.fr3.pack(side = tk.LEFT, padx = 20, pady = 30)
        self.fr3lab.pack()
        self.outlab.pack(ipadx = 10)
        self.updateResult()
        self.mw.mainloop()

    def updateResult(self):
        s1 = int(self.spb1.get())
        s2 = int(self.spb2.get())
        self.result.set(str(s1 + s2))
 
if __name__ == "__main__":
   app = myWindow()
Bei diesen kleinen Anwendungen wie gesagt kein großer Unterschied zu Qt.
Dafür ist es ein wesentlich kleineres Toolkit, das unter Windows auch leichter zu installieren ist. Bei vielen Python-Distributionen ist es einfach gleich mit dabei. Praktisch.

Liest Du noch mit?
 
OP
B

bayernherz

Hacker
hallo abgdf,
ja ich lese noch mit.
Ich danke Dir für die eifige Unterstützung.
Suche momentan eifig nach einem deutschsprachigem Buch.
diese sind aber bereits alle schon etwas angestaubt z.B aus dem Jahr 2006, 2007
und die nachfolgenden aus dem Jahr 2009, werden dann für ca. 200 € verkauft. :irre:
Das ist mir dann doch ein bischen zuviel Geld für ein Buch, dass schon 6 Jahre alt ist.
Neuere ausschliesslich nur in englischer Sprache.
Habe aber auch englisch sprachige PDF-Bucher kostenfrei im Internet gefunden.
c-gui-programming-with-qt-4-2ndedition.pdf
http://www.bogotobogo.com/cplusplus/files/c-gui-programming-with-qt-4-2ndedition.pdf
Leider ist mein installierter Qt-Creater u. Qt-Designer in deutscher Sprache installiert.
Das führt dann bei englischsprachigen Anleitungen zu Begriffsproblemen. :???:

Ansonsten ein einfaches Fenster mit Knöpfchen ohne eigendefiniertem Slot geht schon. :p

viele grüsse aus dem morgendlichen oberbayern
vom bayernherz :p
 

abgdf

Guru
bayernherz schrieb:
Ansonsten ein einfaches Fenster mit Knöpfchen ohne eigendefiniertem Slot geht schon. :p
Wenn Du den Code postest, könnte ich möglicherweise anhand des obigen "calculator"-Beispiels den Slot-Mechanismus hinzufügen.
 
OP
B

bayernherz

Hacker
hallo abgdf ,

danke, ist nett von Dir.
Habe die Sache mit den Signalen und Slots mittlerweile im Griff.
Hierzu habe ich bereits einige kleine simple Beispiel mit dem Qt-Creater u. Qt-Designer programmiert. 8)
Du könntest mir im Moment deutschsprachige Literatur und ggf noch Qt-Foren benennen.
Qt-Forum hattest Du mir ja bereits schon mal eins benannt.

Ich bin im Moment fleissig am Üben und manchmal mit viel Frust. :???:

viele grüsse aus dem abendlichen oberbayern
vom bayernherz :roll:

P.S. hallo feuervogel: du brauchst dir keine Sorgen machen.
Ich gehe mal davon aus das die Uhr falsch ging ! :D
 

abgdf

Guru
bayernherz schrieb:
Habe die Sache mit den Signalen und Slots mittlerweile im Griff.
Hierzu habe ich bereits einige kleine simple Beispiel mit dem Qt-Creater u. Qt-Designer programmiert. 8)
Code, or it didn't happen. :mrgreen:
 
OP
B

bayernherz

Hacker
hallo abgdf,
mein Übungsprojekt tut das was ich mir vorgestellt habe. :thumbs:
Kann es auch ohne laufenden Qt Creater laufen lassen.
Nur auf einem anderen PC nicht! :down:
Da auf dem Desktop kein Qt Creater und Designer installiert ist,
bräuchte ich warscheinlich eine statisch gelinkte Programmdatei.

Ich würde mich freuen, wenn Du mir da weiterhelfen könntest. :roll:

viele grüsse aus dem vorweihnachtlichem Oberbayern
vom bayernherz
 
OP
B

bayernherz

Hacker
hallo abgdf,
danke für Dein Angebot, aber ich muss mir selbst eine
Lösung erarbeiten. D.h.ich benötige eine Lösung die auf meinem PC läuft.

viele grüsse aus dem weihnachtlichen Oberbayern
vom bayernherz :p
 
OP
B

bayernherz

Hacker
hallo comunity,
ich möchte diesen Thread gern schliessen.
Dir abgdf möchte ich in besonderer Form danken.
Mittlerweile habe ich bereits ein bischen Fuss in der Qt-GUI Programmierung gefasst.
Da dieses Thema einen riesigen Umfang hat, tauchen immer wieder Fragen und Probleme
auf.

viel grüsse aus dem abendlichen Oberbayern
vom bayernherz
 
Oben