Qt GUI programing

tom1972 | Σάβ, 06/09/2012 - 14:13 | 2' | 17

Καλημέα σε όλους !!
Ξέρω αρκετά καλά C++, αλλά προσπαθώ να μάθω Qt GUI programming....
Εδώ είναι το πρόβλημα ...
Όλα τα ebooks που έχω κατεβάσει, χρησιμοποιούν το Qt designer, και κατόπιν φτιάχνουν χειροκίνητα τον κώδικα...

ΕΡΩΤΗΜΑ:
Εγώ αρχίζω με qt creator, και δεν μπορώ να βρω οδηγό για προγραμματισμό με τον qt creator. Είναι πολύ διαφορετικός ο τρόπος εργασίας με το πρόγραμμα αυτό ....
Συγκεκριμένα όταν θέλω να χρησιμοποιήσω την connect , αν θέλω να δημιουργήσω κάποιο δικό μου slot για πχ το QLineEdit, δεν ξέρω που να δηλώσω το slot αυτό, και που να το υλοποιήσω ...

Αν κάποιος θέλει να με βοηθήσει μπορώ να του αναφέρω συγκεκριμένο παράδειγμα ....

ΠΡΟΤΑΣΗ: Στο περιοδικό θα ήθελα να υπάρχει μια μόνιμη στήλη με μαθήματα για qt-gui programming .....
Tα μαθήματα που έγιναν στην Αθήνα (http://www.linuxinsider.gr/category/tags/qt-creator-qt-designer) , θα τα παρακολουθούσα , αλλά δυστυχώς μένω στο Βόλο...

Ευχαριστώ εκ των προτέρων . tomkat

Δώσε αστέρια!

MO: (ψήφοι: 0)

Σχόλια

Hello agaian :)
Καταρχάς ο qt designer είναι integrated στον qt creator!
Δηλαδή αν κάνεις δεξί κλικ στο όνομα του project->Αdd New->Qt->Qt Designer Form Class θα σου ανοίξει ο qt designer.

Πχ φτιαχνεις μια φόρμα-κλάση/Qt MainWindow και σχεδιάζεις ένα κουμπί.Επιλέγεις το αρχείο mainwindow.ui και άνοιγμα με form designer. Επιλέγεις το κουμπί με δεξί κλικ και στο pop up menu επιλέγεις το goto slot
μετά επιλέγεις πχ το clicked() το όποιο θα σου φτιάξει μια μέθοδο on_clicked.Μετά αν πας στο αρχείο mainwindow.h θα δεις στα private slots ότι έχει δηλωθεί η μέθοδος     void on_pushButton_clicked();

Μιας και μιλάμε για Qt ρίξε μια ματιά  και στα παρακάτω tutorialshttp://www.youtube.com/user/VoidRealms/videos

Έχω την έκδοση Qt Creator 2.5.0

Φίλε μου ευχαριστώ για την απόκριση .....
Το κόλπο go to slot, το ήξερα αλλά αυτό θυμίζει visual C++, C++ creator.
Αλήθεια φίλε μου αλλά η μέθοδος connect πότε χρησιμοποιείται ;

Πάντως ευχαριστώ για τη συμβουλή... Θα κοιτάξω στο youtube αυτό που μου είπες ...
Θα σε ξαναενοχλήσω σύντομα για το θέμα αυτό ....

Τι κάνεις δεξί κλικ go to slot
τι γράψεις στον κώδικα connect είναιο το ίδιο και το αυτό
Αυτό ξέρω εγώ σαν connect.
Κάποιος προχωρημένος συμφορουμίτης με πιο προχωρημένες γνώσεις qt ίσως μπορέσει να μας διαφωτίσει καλύτερα...

Φίλε μου και αυτές οι συμβουλές σου για μένα είναι πολύτιμες ....
Ευχαριστώ για τη βοήθεια και σίγουρα θα σε ξαναενοχλήσω....
Με εκτίμηση tomkat!

Φίλε zynif το ΒΡΗΚΑ !!!
Δημιούργησα ένα slot για την Αρχική Dialog φόρμα ....
Δηλ στο Dialog.h

class Dialog : public QDialog
{
 ...............
public slots:
    void writeMessage();
 ...............
};

Και στο connect, στο Dialog.cpp

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
..............
    connect(ui->pushButton, SIGNAL(clicked()),
            this, SLOT(writeMessage()));
}

void Dialog::writeMessage()
{
    ui->lineEdit->setText("LINUX");
}

Πρόσεξε φίλε μου ότι το this αναφέρεται στην αρχική φόρμα ....

Kάπου έλεγαν ότι για την κλάση QLineEdit , μπορείς να δημιουργήσεις ότι slot θέλεις, αλλά όχι για την ui->lineEdit, η οποία είναι μέρος της "πατρικής" φόρμας .....

Τα κόλπα που με συμβούλεψες για go to slot, το εφάρμοσα και είναι φοβερό ....

Η σύνταξη για την χρήση του μηχνισμού signals/slots (ή events όπως λέγονται σε άλλες γλώσσες) έχει την εξής δομή:

Στο header file, όταν δημιουργείς μια class δηλώνεις σε αυτή τόσο τα δικά σου signals όσο και τα slots ως εξής:

signals:
  void fooSignal1();

private/public slots:
  void fooSlot();

Μετά, κατά το implamentation της class στο cpp αρχείο, στο constructor
συνδέεσεις τα signals με τα slots χρησιμοποιώντας την συνάρτηση
connect(), π.χ.:

connect(buttonClose, SIGNAL(clicked()), this, SLOT(close());
connect(buttonFoo, SIGNAL(clicked()), this, SLOT(fooSlot());

όπου τα buttonClose και button Foo είναι δύο στοιχεία button, και φυσικά μη ξεχνώντας να υλοποιήσεις και την συνάρτηση fooSlot(). Τώρα για να εγείρεις ένα signal το μόνο που έχεις να κάνεις είναι στο σημείο που θέλεις να το εγείρεις να καλέσεις την εντολή emit:

void fooDialog::fooFunction() {
  ...
  if (bCondition == True) {
    emit fooSignal();
  }
  ...
}

και το πρόγραμμα θα ψάξει να βρει την slot με την οποία έχεις συνδέσει το συγκεκριμένο signal και θα εκτελέσει τον κώδικα που έχεις υλοποιήσει.

Ο μηχανισμός είναι απλός αλλά εξαιρετικά δυναμικός, αφού σου επιτρέπει να κάνεις πολλά πράγματα, ακόμη και να ελέγχεις το ίδιο signal σε πολλά διαδοχικά επίπεδα εκτελώντας πολλαπλά slots.

Προσπαθούσα να γράψω αυτά που έγραψα παραπάνω, σε ένα κείμενο "κανόνα", ψάχνοντας στο internet για πληροφορίες, και ΝΑ ΤΩΡΑ, που οι πληροφορίες ήρθαν από τον ουρανό και μάλιστα με τη μορφή ΚΑΝΟΝΩΝ....

Δηλ οι πληροφορίες που μου έδωσες είναι ΥΠΕΡ-ΠΟΛΥΤΙΜΕΣ και σε ΕΥΧΑΡΙΣΤΩ πολύ για την βοήθεια και την καθοδήγηση ....
Με εκτίμηση tomkat !!!

Υστερόγραφο:
Όταν λέμε εγείρω signal, τι εννοείς; Αν έχω emit cliked(); πατιέται μόνο του ; [[ΩΧ ΧΑΖΟΜΑΡΑ ΕΙΠΑ ;;; Απλά δεν το έχω ξανακούσει - τώρα μαθαίνω .....]]

Όπως ακριβώς το είπες!

Μπορείς με κώδικα να προκαλέσεις (εγείρεις) ένα γεγονός (event όπως λέγεται στην οικογένεια Visual ή signal όπως λέγεται στην Qt/C++) καλώντας την emit. Η Qt/C++ όμως πιο δυναμική καθώς σου επιτρέπει να δημιουργήσεις και δικά σου γεγονότα, τα οποία δεν υπάρχουν, ώστε να εξυπηρετήσεις της ειδότερες ή πολυπλοκότερες ανάγκες του δικού σου προγράμματος. Για παραδέιγμα έχεις μια συνάρτηση η οποία αναζητά ένα πεδίο σε μια βάση δεδομένων. Η Qt/C++ σου δίνει την δυνατότητα, αντί η συνάρτηση μόλις βρίσκει το πεδίο να καλεί μια άλλη συνάρτηση, να δημιουργεί ένα γεγονός (signal). Με τον τρόπο αυτό μπορείς να έχεις πολλούς ταυτόχρονα "ακροατές" (slots) οι οποίοι μόλις ακούσουν το γεγονός να αναλάβουν όλοι σχετική δράση.

Ο μηχανισμός αυτός στα περισσότερα προγράμματα (όπου τα signals/slots ελέγχουν κυρίως γεγονότα από συσκευές εισόδου, όπως κλικ ποντικού, ή πάτημα ένος πλήκτρου πάνω σε έτοιμα στοιχεία, όπως κουμπιά, περιοχές κειμένου κ.λπ.) δεν μπορεί να ξεδιπλώσει την χρηστιμότητά του, αντίθετα σε αναγκάζει να γράψεις περισσότερο κώδικα, αφού για να συνδέσεις το πάτημα ενός κουμπιού πρέπει να εισάγεις τόσο την συνάρτηση που υλοποιεί τις ενέργειες από το πάτημα του κουμπιού, όσο και την συνάρτηση connect() για κάθε πιθανό γεγονός ( σε αντίθεση που τις γλώσσες Visual, οπου η σύνδεση είναι αυτόματη και το μόνο που χρειάζεται είναι να δώσεις ένα συγκκριμένο όνομα στην συνάρτηση που υλοποιεί την ενέργεια), με αποτέλεσμα μερικές φορές να ξεχνάς την connect(). Για απλά προγράμματα συνιστάται η χρήση του QtDeigner, που απλοποιεί λίγο τις διαδικασίες αυτές.

Ο μηχανισμός όμως αυτός είναι το τέλειο εργαλέιο, εάν θέλεις να δημιουργήσεις επεκτάσεις (π.χ. νεα στοιχεία ελέγχου) ή όταν αναπτύσσεις σύνθετα και πολύπλοκα προγράμματα ή προγράμματα για την γραμμή εντολών. Το KDE δεν θα μπορούσε να είχε υλοποιηθεί τόσο γρήγορα και σωστά, χωρίς τον συγκεκριμένο μηχανισμό.

Αυτά που μόλις μου είπες, είναι βουνό πληροφοριών που ίσως πουθενά δε θα έβρισκα , καθ'ότι όλα τα manual είναι στα αγγλικά ....
Ευχαριστώ και πάλι για τη διαδασκαλία... Θα σας ξαναενοχλήσω για τέτοια θέματα ..... Με εκτίμηση tomkat !!

tomkat]Καλημέρα σε όλους !!
Ξέρω αρκετά καλά C++, αλλά προσπαθώ να μάθω Qt GUI programming....
Εδώ είναι το πρόβλημα ...
Όλα τα ebooks που έχω κατεβάσει, χρησιμοποιούν το Qt designer, και κατόπιν φτιάχνουν χειροκίνητα τον κώδικα...

ΕΡΩΤΗΜΑ:
Εγώ αρχίζω με qt creator, και δεν μπορώ να βρω οδηγό για προγραμματισμό με τον qt creator. Είναι πολύ διαφορετικός ο τρόπος εργασίας με το πρόγραμμα αυτό ....
Συγκεκριμένα όταν θέλω να χρησιμοποιήσω την connect , αν θέλω να δημιουργήσω κάποιο δικό μου slot για πχ το QLineEdit, δεν ξέρω που να δηλώσω το slot αυτό, και που να το υλοποιήσω ...

Αν κάποιος θέλει να με βοηθήσει μπορώ να του αναφέρω συγκεκριμένο παράδειγμα ....

ΠΡΟΤΑΣΗ: Στο περιοδικό θα ήθελα να υπάρχει μια μόνιμη στήλη με μαθήματα για qt-gui programming .....
Tα μαθήματα που έγιναν στην Αθήνα (http://www.linuxinsider.gr/category/tags/qt-creator-qt-designer) , θα τα παρακολουθούσα , αλλά δυστυχώς μένω στο Βόλο...

Ευχαριστώ εκ των προτέρων . tomkat

Tomkat, δεν μου αρέσει να παραπέμπω σε προσωπικό ιστολόγιο, αλλά δεν θυμάμαι και δεν βρίσκω που τα είχα δημοσιεύσει στο forum του περιοδικού.

Οπότε ρίξε μια ματιά εδώ:

Ειδικά τα πρώτα δύο θα σε βοηθήσουν να μάθεις τα βασικά.

Σημείωση: Είναι λίγο παρωχημένα όσα περιγράφω για εγκατάσταση του SDK κλπ κλπ, αλλά εσύ αυτά δεν τα χρειάζεσαι αφού φαντάζομαι προτιμάς να δουλέψεις με το QtCreator... Οπότε παρέκαμψέ τα και πήγαινε στο ζουμί, δηλαδή εκεί που περιγράφω το τι κάνει η κάθε γραμμή κώδικα.

Αν θες κάτι ξαναπόσταρε εδώ...

@ dimitris

Δημήτρη τις σημειώσεις σου τις έχω ξεψαχνήσει...
Αυτό που χρησιμοποίησα και δεν έβρισκα πουθενα, ήταν το πως σε ένα lineedit μπορώ να εισάγω αριθμητικά δεδομένα...
Το κόλπο που το είχα φανταστεί και μόνος μου, ήταν ακριβώς το ίδιο με αυτό που παρουσίασες κι εσύ.

Κανένα κακό πάντως δεν βλέπω να παραπέμπεις στις προσωπικές σου σημειώσεις... Το προσωπικό σου site έχει χρήσιμα πράγματα...

Κάτι άλλο...
Κάνω μια καλή επανάληψη στη C++ σε βαριές έννοιες, και συγκεκριμένα στην βιβλιοθήκη STL...

Εκεί έχω ένα πρόβλημα...
Όταν προσπαθώ να χρησιμοποιήσω iterators, για την vector, δεν τους αναγνωρίζει κανένας μεταγλωτιστής...
Ούτε qtcreator, g++, devcpp, borland c++...
Μου βγάζει το εξής:

error: 'iteraror' is not a member of 'std::vector'

Σε κανά 2 μέρες θα γράψω συγκεκριμένα για το πρόβλημα, σε συγκεκριμένο πρόγραμμα (απλά θέλω να το "σουλουπώσω"), αλλά εξ'αρχής ρωτάω μήπως έχεις κάποια ιδέα για το τι παίζει...

Ευχαριστώ εκ των προτέρων ....

tomkat]@ dimitris

Μου βγάζει το εξής:

error: 'iteraror' is not a member of 'std::vector'

Σε κανά 2 μέρες θα γράψω συγκεκριμένα για το πρόβλημα, σε συγκεκριμένο πρόγραμμα (απλά θέλω να το "σουλουπώσω"), αλλά εξ'αρχής ρωτάω μήπως έχεις κάποια ιδέα για το τι παίζει...

Ευχαριστώ εκ των προτέρων ....

Αν το έχεις κάνει copy/paste, τότε το πρόβλημα είναι απλό :)

Έχεις γράψει λάθος το "iterator". Εσύ το γράφεις iteraror γι' αυτό και δεν στο βρίσκει...

Αρχοντα ψάχνω 2 εβδομάδες να βρω που είναι το λάθος, και δεν το έβλεπα ο γκαβός....
Το προσωπικό πρόβλημα που σου ανέφερα ιδιαιτέρως με αποσβόλωσε...
ΕΥΧΑΡΙΣΤΩ ΠΟΥ ΜΟΥ ΑΝΟΙΞΕΣ ΤΑ ΜΑΤΙΑ ....
Καλά μιλάμε τώρα έπαθα πλάκα ...!!!!!

Παραφράζοντας τον Χολμς, μερικές φορές όταν αποκλείσεις όλα τα άλλα η μόνη εξήγηση είναι το αυτονόητο. :)