dimitris kalamaras

mathematics, social network analysis, free software…

Qt (Μέρος Ι): Convertor

Το Q Toolkit (Qt) είναι μία εργαλειοθήκη για δημιουργία εφαρμογών με γραφικό περιβάλλον (GUI), αντίστοιχη της GTK του Gnome. Ξεκίνησε να αναπτύσσεται το 1991 από τους Haavard Nord and Eirik Chambe-Eng και έγινε η βάση πάνω στην οποία στηρίχτηκε ολόκληρο το γραφικό περιβάλλον KDE. Ουσιαστικά, οι εκδόσεις του KDE ακολουθούν πάντα τις αναβαθμίσεις της Qt. H Qt αναπτύσσεται πλέον από τη Νορβηγική Trolltech, και υπάρχουν ανοικτού κώδικα εκδόσεις της για Unix, Mac OS, Windows και embedded συστήματα.

Λίγη ιστορία

Μέχρι την έκδοση 1.45, η άδεια χρήσης της Qt (FreeQt) δεν ήταν συμβατή με τις άδειες χρήσης ανοικτού κώδικα του OSI (www.opensource.org) αλλά και τον ορισμό του ελεύθερου λογισμικού (www.fsf.org), πράγμα που έκανε πολλούς developers να ανησυχούν για την εξέλιξη του KDE. Η άδεια άλλαξε με την Qt2 που είχε άδεια Q Public License, την οποία όμως το FSF θεώρησε και πάλι ασύμβατη με την GPL. Το αποτέλεσμα ήταν η ανάπτυξη ανταγωνιστικών προσπαθειών, όπως της εργαλειοθήκης Harmony και του Gnome. Το Harmony ήταν μια άδοξη προσπάθεια αναδημιουργίας της Qt με άδεια GPL ενώ, πιο φιλόδοξα, το Gnome έθεσε ως στόχο την αντικατάσταση του KDE στα desktops μας (από εκεί πηγάζει η αντιπαράθεση KDE εναντίον Gnome, που όμως έχει πλέον ατονήσει).

Ως απάντηση, το 1998, δημιουργήθηκε το Ίδρυμα” KDE Free Qt” για να εγγυηθεί ότι η Qt θα περάσει σε μια BSD άδεια αν η Trolltech δεν συνεχίσει την ανάπτυξη της ανοικτού κώδικα έκδοσης για Linux. Το 2000, η άδεια χρήσης της Linux έκδοσης της Qt άλλαξε επιτέλους στην GPL 2 (αλλά όχι και η έκδοση των Windows) και το πρόβλημα λύθηκε τελικά με την έκδοση Qt 4, που κυκλοφόρησε υπό την GPL για όλες τις πλατφόρμες. Έτσι είναι πλέον εφικτό να αναπτύξει κανείς GPL εφαρμογές για X11 (Linux, Solaris, AIX, κλπ), Windows, Mac OS X αλλά και φορητές συσκευές, χρησιμοποιώντας την ίδια εργαλειοθήκη, δηλαδή οι εφαρμογές της Qt τρέχουν άνετα και στις τρεις μεγάλες πλατφόρμες αλλά και σε embedded συσκευές (PDA, κινητά, κλπ). Αυτή η πολυπλατφορμικότητα είναι σημαντικό ατού της Qt γιατί οι developers χρειάζονται να μάθουν μόνο ένα API για να γράψουν γραφικές εφαρμογές που να τρέχουν παντού.

Η Qt έκανε μεγάλη πρόοδο με τη έκδοση 4.0, που κυκλοφόρησε τον Ιούνιο του 2005 και εισήγαγε σημαντικές νέες τεχνολογίες:

  • Tulip: Ένα σύνολο από container κλάσεις (QList, QLinkedList, Qvector, QStack, QQueue, Qmap, κλπ) με νέους iterators σε στυλ Java (“foreach”).
  • Interview: Μια αρχιτεκτονική model/view για προβολές αντικειμένων σε πίνακα, δέντρο, και λίστα (QTableView, QTreeView, και QListView)
  • Arthur: ένα πλαίσιο εργασίας QGraphicsView για 2D σχεδίαση με backends για OpenGL, PostScript, QuickDraw, X11, κλπ.
  • Scribe: Ένας renderer για Unicode κείμενο και layout.
  • MainWindow: Μια κλάση-βάση για μοντέρνα βασικά παράθυρα, εργαλειοθήκες, μενού κλπ.

Οι επόμενες εκδόσεις 4.x πρόσθεσαν υποστήριξη για SVG διανυσματικά γραφικά, εξαγωγή σε PDF και SVG, CSS στο στυλ των widgets, αλλά και υποστήριξη για Vista. Οι νέες δυνατότητες της Qt ήταν ουσιαστικά η αφετηρία για τη δημιουργία του επερχόμενου KDE 4. Σημειώστε ότι ένας σημαντικός λόγος για την καθυστέρηση στην κυκλοφορία του νέου KDE ήταν και η ασυμβατότητα της Qt4 με την Qt3…

Βασικές συνιστώσες

Τι κάνει όμως την Qt να είναι τόσο σημαντική για την ανάπτυξη εφαρμογών και γιατί την προτιμούν τόσοι developers; Η απάντηση είναι ότι η Qt απλοποιεί την δημιουργία γραφικών εφαρμογών μια και προσφέρει “σε ένα πακέτο” τα εξής:

  • Κλάσεις: Η βάση της Qt αποτελείται από 400+ κλάσεις για containers, δημιουργία και σχεδίαση GUI, βάσεις δεδομένων, δικτύωση, υποστήριξη XML και πολυγλωσσικότητας, OpenGL, κά,
  • Qt Designer: Μια εφαρμογή οπτικής δημιουργίας GUI μέσω του ποντικιού, που επιτρέπει την γρήγορη ανάπτυξη γραφικών περιβαλλόντων που είναι ίδια σε όλες τις πλατφόρμες.
  • Qt Linguist: Ένα σύνολο εργαλείων για εύκολη υποστήριξη πολλών γλωσσών, που διευκολύνει την μετάφραση των μηνυμάτων και των μενού κάθε εφαρμογής Qt.
  • Qt Assistant: Μια εφαρμογή εύρεσης και προβολής της τεκμηρίωσης της Qt, που μπορεί να ενσωματώνεται με αλλαγές μέσα στις εφαρμογές Qt.

Στην πράξη

Αυτά στη θεωρία. Για να τα δούμε αυτά στην πράξη, σε αυτή τη σειρά tutorials, θα επιχειρήσουμε να σας δείξουμε πόσο εύκολη είναι η δημιουργία εφαρμογών με την Qt. Θα βασιστούμε στην Qt 4.2+ οπότε, ανάλογα με τη διανομή σας, θα χρειαστεί να εγκαταστήσετε τα εξής πακέτα:

PCLinuxOS/Mandriva:
libqt4-devel, libqt3support4, qt4-common, qt4-examples, qt4-designer, qt4-assistant, g++
Debian/Ubuntu/Sidux:
libqt4-dev, libqt4-qt3support, qt4-dev-tools, qt4-designer, qt4-doc, qt4-assistant, g++
Fedora:
qt4, qt4-x11, qt4-devel, qt4-doc, qt4-examples, g++

Για εισαγωγή, θα χρησιμοποιήσουμε μόνο το Qt Designer για να φτιάξουμε μια απλή εφαρμογή. Στα επόμενα tutorials θα χρειαστούμε και το KDevelop, για πιο πολύπλοκες εφαρμογές, οπότε καλό είναι να το εγκαταστήσετε κι αυτό. Εδώ, όμως θα επιχειρήσουμε να φτιάξουμε έναν απλό μετατροπέα μονάδων, οπότε αρκεί το Qt Designer και ένας κειμενογράφος όπως το Kate για τον λίγο κώδικα που θα γράψουμε.

GUI στο λεπτό!

Αρχικά θα φτιάξουμε τη φόρμα, δηλαδή το γραφικό περιβάλλον, της εφαρμογής με το QtDesigner. Τρέξτε λοιπόν το QtDesigner, από το μενού της διανομής σας (από τη γραμμή εντολών δώστε designer-qt4). Θα εμφανιστούν 6 μικρά και μεγάλα παράθυρα (κάτι σαν το Gimp). Το παράθυρο στα αριστερά, με τίτλο QtDesigner, είναι το βασικό και διαθέτει μια εργαλειοθήκη με διάφορα αντικείμενα πάνω του. Αυτά είναι τα διάφορα widgets (γραφικά στοιχεία: μενού, πεδία, κλπ) που μπορούμε να εισάγουμε στη φόρμα μας. Ο μικρός διάλογος στη μέση μας ρωτά για το είδος της φόρμας που θέλουμε να φτιάξουμε. Εκεί υπάρχουν 4 επιλογές (κατά σειρά): Dialogue with buttons bottom, Dialogue with buttons right, Main Window και Widget. Οι πρώτες δύο είναι για δημιουργία απλών διαλόγων ενώ οι δύο τελευταίες είναι οι πιο ενδιαφέρουσες γιατί επιτρέπουν τη δημιουργία κανονικών εφαρμογών. Με την Main Window φτιάχνουμε πλήρη παράθυρα εφαρμογών με μενού ενώ με τη Widget φτιάχνουμε παράθυρα χωρίς μενού (για πιο απλές εφαρμογές). Επιλέξτε λοιπόν το Widget και πατήστε το κουμπί Create. Θα εμφανιστεί μια κενή φόρμα (στην περίπτωση που δεν δείτε τον διάλογο δημιουργίας φόρμας, πατήστε Ctrl+N).

Η φόρμα μας θα έχει ένα μικρό πεδίο εισαγωγής όπου θα γράφουμε τον αρχικό αριθμό, και δύο drop-down μενού για τις μονάδες εισόδου και εξόδου. Θα έχουμε επίσης ένα πεδίο για την προβολή του τελικού αριθμού, και φυσικά ένα κουμπί για την εκτέλεση της μετατροπής και ένα για έξοδο.

Για να προσθέσετε αυτά τα widgets, σύρετε τα από την εργαλειοθήκη του QtDesigner στα αριστερά της οθόνης. Από το τμήμα Display Widgets (στο κάτω μέρος), σύρετε τέσσερα “Label” και ένα “LCD Number” για την προβολή του αριθμού. Τα Labels θα είναι οι ετικέτες που θα δίνουν “τίτλους” σε κάθε αντικείμενο της φόρμας (εκτός των κουμπιών). Από τα Input Widgets, σύρετε δύο “Combo Box” and “Line Edit” όπου θα γράφουμε το αρχικό νούμερο. Τέλος, από την λίστα με τα Buttons, σύρετε δύο “Push Button” πάνω στη φόρμα. Το ένα θα είναι το κουμπί στο οποίο θα κάνει κλικ ο χρήστης για να γίνει η μετατροπή και το άλλο θα είναι το κουμπί Quit.

Διαρρύθμιση

Αυτό ήταν! Τώρα πρέπει να προσαρμόσουμε τα widgets της φόρμας ώστε να έχουν μια πιο καλαίσθητη διαρρύθμιση. Μπορείτε να τα βάλετε όπως θέλετε, αλλά θυμηθείτε ότι κάθε πεδίο και drop-down μενού πρέπει να έχει ένα Label από πάνω του. Επομένως, βάλτε το Line Edit, και τα δύο Combo Boxes στη σειρά και από πάνω τους τα τρία Labels. Αυτά θα είναι οι ετικέτες τους, οπότε πρέπει να αλλάξετε το περιεχόμενό τους από “TextLabel” σε κάτι πιο χρήσιμο. Κάντε δεξί κλικ σε καθένα και επιλεξτε “Change Text”. Στο Label του Line Edit γράψτε “Amount”, στο πρώτο Combo box γράψτε “From” και στο δεύτερο “Το”. Στο διάλογο επεξεργασίας ονόματος μπορείτε να επιλέξετε το στυλ της γραμματοσειράς. Αν θέλετε το κείμενο να εμφανίζεται στο κέντρο του κάθε Label, κάντε κλικ σε αυτό και από το παράθυρο του Property Editor, κάντε κλικ στην ιδιότητα “alignment” και στο μενού horizontal επιλέξτε το ‘Qt::AlignHCenter’ .

Το τέταρτο Label θα είναι ο τίτλος της εφαρμογής. Κάντε δεξί κλικ > “Change Text” σε αυτό και δώστε ένα όνομα στην εφαρμογή σας. Μια και πρόκειται για τίτλο, είναι καλύτερα να μεγαλώσετε το μέγεθος της γραμματοσειράς του. Εάν το κείμενο του τίτλου “κόβεται”, τραβήξτε την κάτω δεξιά άκρη του widget μέχρι να εμφανιστεί όλος ο τίτλος.

Με τον ίδιο τρόπο, αλλάξτε την ετικέτα των δύο Push Buttons σε “Convert” και “Quit”. Τέλος, θα πρέπει να προσθέσετε αντικείμενα στα δυο κουτιά Combo για τις μονάδες μετατροπής. Κάντε δεξί κλικ πάνω τους και επιλέξτε “Edit Items”. Εκεί προσθέστε ‘inches’ και ‘cm’. Μόλις τελειώσετε με αυτά, ακολουθήστε τα βήματα από το πλαίσιο “Δημιουργία Layout” για να προσαρμόσετε καλύτερα την εμφάνιση της εφαρμογής.

Πριν προχωρήσουμε, ας δούμε τι μπορούμε να κάνουμε με τα signals/slots του QtDesigner. Τα signals/slot είναι ένας μηχανισμός για τη διασύνδεση widgets μέσω “σινιάλων”. Αυτό που θέλουμε να κάνουμε είναι όταν πατάμε Enter στο πεδίο LineEdit, να γίνεται ένα εφέ κίνησης στο κουμπί Convert!. Γι’ αυτό, πατήστε F4 για να μπείτε στην λειτουργία signals/slots. Κάντε κλικ στο πεδίο LineEdit και μετά κάντε κλικ στο κουμπί Convert. Θα εμφανιστεί ένας νέος διάλογος με signals και slots από κάθε widget. Από αριστερά, επιλέξτε το signal returnPressed() του LineEdit και από δεξιά επιλέξτε το slot animateClick() του κουμπιού Convert. Για να δείτε τι ακριβώς γίνεται και ποια είναι η πραγματική μορφή της φόρμας, πατήστε Ctrl+R. Μετά πατήστε Ctrl+S και αποθηκεύστε την φόρμα με το όνομα convertorform.ui.

Προσθήκη κώδικα

Τώρα που είναι έτοιμη η φόρμα, είναι καιρός να τις βάλουμε λειτουργικότητα. Γι’ αυτό θα χρειαστεί να φτιάξουμε τρία αρχεία, στον ίδιο φάκελο που έχουμε αποθηκεύσει το αρχείο της φόρμας: main.cpp, convertor.h, και convertor.cpp. To main.cpp είναι το βασικό αρχείο κάθε εφαρμογής C++/Qt και εκεί ορίζεται η κλάση main(). Στα άλλα δύο αρχεία θα ορίσουμε το API και τις μεθόδους της εφαρμογής μας στην κλάση Convertor. Γράψτε τις παραπάνω γραμμές με έναν κειμενογράφο και αποθηκεύστε το αρχείο main.cpp:

#include <qapplication>
#include "convertor.h"
 
int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    Convertor convertor;
    convertor.show();
    return app.exec();
}</qapplication>

Αρχικά κάνουμε include, δηλαδή εισάγουμε, την βασική κλάση QApplication της Qt, αλλά και την κλάση Convertor. Mετά τη γραμμή int main, ορίζουμε το βασικό αντικείμενο της εφαρμογής (app) και ένα στιγμιότυπο της κλάσης Convert (που θα δούμε σε λίγο). Οι δύο τελευταίες γραμμές προβάλλουν το GUI και εκτελούν την εφαρμογή. Ουσιαστικά η main θα έχει πάντα την ίδια περίπου μορφή σε όλες τις εφαρμογές μας.

Στο αρχείο convertor.h θα ορίσουμε την κεντρική (και μοναδική) κλάση της εφαρμογής μας, την Convertor που θα παράγουμε από την κλάση QWidget της Qt. Συνήθως, τα αρχεία .h περιέχουν μόνο το header μιας κλάσης, δηλαδή κάτι σαν τον ορισμό της (αυτό που συχνά λέγεται API) ενώ τα αρχεία .cpp περιέχουν τον κανονικό κώδικα κάθε μεθόδου. Να το header, λοιπόν:

#ifndef CONVERTOR_H
#define CONVERTOR_H
 
#include "ui_convertorform.h"
 
class Convertor : public QWidget
{
    Q_OBJECT
 
public:
    Convertor(QWidget *parent = 0);
private slots:
	void conVert();
private:
    Ui::ConvertorForm ui;
};
 
#endif

Οι δύο πρώτες γραμμές λένε ότι πρόκειται για ορισμό νέας κλάσης ενώ η γραμμή include “ui_convertorform.h” εισάγει το αρχείο ui_convertorform.h στην εφαρμογή κατά τη μεταγλώττισή της. Το αρχείο αυτό παράγεται αυτόματα από την φόρμα μας μέσω της εντολής qmake-qt4 (θα τη δούμε σε λίγο) και μας προσφέρει πρόσβαση στα στοιχεία της. Η κλάση έχει μία ομώνυμη constructor μέθοδο (εκεί γίνεται η αρχικοποίηση της εφαρμογής), μία ιδιωτική μέθοδο (conVert()) που θα κάνει τον υπολογισμό όταν κάνουμε κλικ στο κουμπί “Convert” και ένα ιδιωτικό μέλος-δεδομένων το οποίο είναι το αντικείμενο της φόρμας. Ο ορισμός της κλάσης τελειώνει πάντα με #endif.

Αφού αποθηκεύσουμε το header, θα γράψουμε στο convertor.cpp τον κώδικα των μεθόδων που έχουμε ορίσει στο convertor.h. Να ο κώδικας:

#include <qapplication>
#include "convertor.h"
 
Convertor::Convertor(QWidget *parent)
    : QWidget(parent){
    ui.setupUi(this);
    connect (ui.pushButton,SIGNAL(clicked()), this,SLOT(conVert()));
}
 
void Convertor::conVert() {
      QString amount_str = ui.lineEdit->text();
      float amount = amount_str.toFloat();
      switch (ui.comboBox->currentIndex()){
            case 0:
            if ( ui.comboBox_2->currentIndex() == 1)
                        amount = amount * 0.3937;
            break;
       }
      ui.lcdNumber->display(amount);
}</qapplication>

Στην πρώτη γραμμή, εισάγουμε μια βασική κλάση (QtGui) της Qt4 που μας προσφέρει όλη τη λειτουργικότητα που θα χρησιμοποιήσουμε σε μια γραφική εφαρμογή. Από κάτω, εισάγουμε το header της κλάσης μας, προκειμένου να ξέρει ο μεταγλωττιστής σε ποια κλάση ανήκουν οι μεθόδοι που ορίζουμε παρακάτω. Στη συνέχεια καθορίζουμε την Convertor μέθοδο. Η γραμμή ui.setupUi(this); είναι τυπική όταν χρησιμοποιούμε φόρμες και κατά κάποιον τρόπο “ετοιμάζει” τα widgets της φόρμας προκειμένου να χρησιμοποιηθούν από τον κώδικα. Η επόμενη γραμμή είναι δείγμα του μηχανισμού signal/slot της Qt. Αυτό που λέει είναι “όταν το κουμπί pushButton της φόρμας δώσει το σήμα (SIGNAL) ότι έχει πατηθεί, τότε τρέξε την μέθοδο (SLOT) conVert”. Απλό, έτσι;

Στη συνέχεια, καθορίζουμε το τι θα κάνει στην πράξη η conVert(). Στην πρώτη γραμμή της μεθόδου, παίρνουμε το κείμενο που υπάρχει στο lineEdit πεδίο της φόρμας και το βάζουμε στη string μεταβλητή amount_str. Μετά, μετατρέπουμε το string σε δεκαδικό αριθμό με την μέθοδο toFloat() της κλάσης QString. Ύστερα μπαίνουμε σε μια διακλάδωση υπό συνθήκη (switch). Ουσιαστικά, βάζουμε την switch να ελέγχει το τι περιέχει το πρώτο drop-down μενού της φόρμας (το comboBox με τις μονάδες εισόδου). Ο έλεγχος γίνεται από τη μέθοδο currentIndex() του comboBox. Αν ο δείκτης είναι 0 (δηλαδή έχει επιλεγεί το inches), τότε η switch ελέγχει αν ο δείκτης του δεύτερου μενού (comboBox_2) είναι 1 (δηλαδή γράφει cm). Σε αυτήν την περίπτωση κάνουμε τον υπολογισμό από ίντσες σε εκατοστά πολλαπλασιάζοντας επί 0,3937. Στην τελευταία γραμμή, λέμε στο στοιχείο lcdNumber της φόρμας να εμφανίσει τον νέο αριθμό.

Αυτό είναι όλο. Έχουμε τελειώσει την εφαρμογή μας. Το μόνο που μένει είναι να φτιάξουμε ένα αρχείο convertor.pro στο οποίο θα γράψουμε τα ονόματα των αρχείων του project. Ένα αρχείο .pro υπάρχει σε κάθε εφαρμογή Qt, μια και η Qt δεν χρησιμοποιεί το Autoconf αλλά έναν διαφορετικό (αλλά απλούστερο) μηχανισμό, το QMake. Η εντολή qmake-qt4 διαβάζει το αρχείο .pro, για να βρει τα αρχεία που έχουμε στο project μας (τα οποία βρίσκονται στον ίδιο φάκελο) και παράγει αυτόματα το αρχείο Makefile, που είναι απαραίτητο για να χτίσουμε την εφαρμογή μας. Γράψτε λοιπόν τον παρακάτω κώδικα σε ένα νέο αρχείο και σώστε το ως convertor.pro:

HEADERS     = convertor.h
FORMS       = convertorform.ui
SOURCES     = main.cpp\
convertor.cpp

Τώρα το μόνο που μένει είναι να δώσετε από το φάκελο της εφαρμογής σας την εντολή make. Ο μεταγλωττιστής g++ θα διαβάσει το Makefile και θα χτίσει την εφαρμογή. Σε λίγο, θα βρείτε ένα εκτελέσιμο αρχείο convertor στον ίδιο φάκελο. Δώστε ./convertor και απολαύστε!

Κατεβάστε το πακέτο με τον κώδικα, τη φόρμα και τα εκτελέσιμα από εδώ.

Previous

Sombrero!

Next

Prime numbers’ generator

15 Comments

  1. Pantelis

    Καλησπέρα και μπράβο για το εύχρηστο και κατανοητό tutorial. Υπάρχει μονάχα ένα προβλημάτακι:
    Και στην 1η #include του main.cpp και στην 1η του convertor.cpp δεν έχει συμπεριληφθεί το όνομα της Qt4 βιβλιοθήκης που γίνεται included. Aν και επεξηγείται ποιο είναι το καθένα (στο κείμενο που ακολουθεί) αν ο χρήστης κάνει απλά #include και #include αντίστοιχα λαμβάνει συνεχώς το error :

    convertor.h:15: error: ‘ConvertorForm’ in namespace ‘Ui’ does not name a type
    make: *** [main.o] Error 1

    Μπράβο και πάλι για την προσπάθεια σου να γράψεις όλα αυτά!

  2. Ευχαριστώ για τη διόρθωση, Παντελή. Το διόρθωσα.

    –ΔΚ

  3. Nikos

    Poly kalos odigos mpravo!

    Thelw na rwtisw an yparxei kapoios odigos i vivlio pou na exei tis entoles tis Qt4, dld tis edoles opws oi amount_str.toFloat(); ,display(amount); alla oles k ti kanoun.
    Episis an egrafes enan kwdika se C++ pou na etrexe mia exiswsi kai na epairne tous arithmous apo tin forma, ayto tha douleye i prepei na einai kodikas Qt4!!

    eyxaristw

  4. Νίκο,

    – ο όποιος κώδικας C++ δουλεύει μια χαρά με φόρμα Qt. Άλλωστε, ο κώδικας Qt4 είναι κώδικας C++.

    – Για βιβλία δες αυτά:
    C++ GUI Programming with Qt 4 (2nd Edition) (Prentice Hall Open Source Software Development Series)

    C++ GUI Programming with Qt4

    Υπάρχει φυσικά και το Qt Assistant, μια εφαρμογή που σου δίνει όλη την τεκμηρίωση της Qt4 μαζί με tutorials…και δεν κοστίζει τίποτα.

  5. Συγχαρητήρια για το άρθρο.Πραγματικά πολύ καλό.
    Έχεις αναπτύξει κάτι πάνω σε qt ?
    Βρίσκομαι σε διακοπές και με τρώει ο κώλος μου να ασχοληθώ με τα IDE του linux.

  6. Ευχαριστώ. Αναπτύσσω το SocNetV, μια εφαρμογή οπτικοποίησης και μαθηματικής ανάλυσης κοινωνικών δικτύων:
    http://socnetv.sourceforge.net

  7. malos

    Μπράβο Δημήτρη για τον κόπο σου.
    Επιχείρησα να το κάνω στην jaunty 9.04 αλλά δεν μπορούσα να βάλω όλα τα πακέτα που πρέπει ( τα ξέχασα τώρα ! Νομίζω πως κόλαγε να βάλει το libglu1-mesa-dev … αν θυμάμαι )

    Το επιχείρησα όμως και στην ultimate 2.2 και τα έκανα κατά γράμμα. Όταν έφτασε η ώρα του make όμως μου έβγαλε αυτά :

    [email protected]:~/Επιφάνεια εργασίας/xm$ make
    /usr/bin/uic-qt4 convertorform.ui -o ui_convertorform.h
    g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -o main.o main.cpp
    In file included from main.cpp:2:
    convertor.h:15: σφάλμα: ‘ConvertorForm’ in namespace ‘Ui’ does not name a type
    make: *** [main.o] Error 1
    [email protected]:~/Επιφάνεια εργασίας/xm$

    Τι σημαίνουν ;

  8. Malos, κατέβασε το πακέτο με τον κώδικα, τη φόρμα και τα εκτελέσιμα από εδώ για να συγκρίνεις με τα δικά σου και να εντοπίσεις το πρόβλημα.

  9. malos

    Αποσυμπίεσα το αρχείο που μου έδωσες και μέσα στον φάκελο convertor διέγραψα το εκτελέσιμο μαζί με 2-3 άλλα που παράγονται μετά το make. Άφησα δηλαδή τα convertor.cpp
    convertor.h
    convertor.pro
    convertorform.ui
    main.cpp
    Makefile (το δικό σου).
    Σκέφτηκα ότι έτσι θα αποδειχτεί ότι είχα λάθος το Makefile.
    Τελικά το make μου έδωσε :

    [email protected]:~/Επιφάνεια εργασίας/convertor$ make
    /usr/bin/qmake-qt4 -unix -o Makefile convertor.pro
    /usr/bin/uic-qt4 convertorform.ui -o ui_convertorform.h
    make: /usr/bin/uic-qt4: Command not found
    make: *** [ui_convertorform.h] Error 127

    Ψάχνω τώρα περί αυτής της εντολής (uic-qt4).

  10. Πριν τρέξεις την εντολή make, πρέπει να τρέξεις την εντολή qmake για να ρυθμίσει σωστά τo Makefile σου. Γι’ αυτό σου βγάζει τα περίεργα μηνύματα — επειδή χρησιμοποίησες ένα Makefile που προέρχεται από άλλη διανομή και …άλλη εποχή! 🙂 Τρέξε qmake μέσα στον φάκελο και θα δεις…

  11. Konstantinos

    Επειδή είμαι σχετικά καινούργιος στο “παιχνίδι” θα ήθελα να κάνω μια ερώτηση. Το εκάστοτε toolkit είναι μόνο για τον developer ενός προγράμματος ή χρειάζεται και σε κάθε υπολογιστή που θα τρέχει το πρόγραμμα?
    Δηλαδή, αν πάω το πρόγραμμα μου σε ένα άλλο σύστημα θα πρέπει να εγκαταστίσω και εκεί τις βιβλιοθήκες του Qt?
    Μπορείτε μήπως να εξηγήσετε τον τρόπο που δουλεύουν τα toolkits γιατί δεν μπόρεσα να βρώ κάτι που να το ξεκαθαρίζει.
    Ευχαριστώ!

  12. Τα toolkits είναι για τον προγραμματιστή, φυσικά, αλλά επειδή περιέχουν και τις βιβλιοθήκες που τρέχει η εκάστοτε εφαρμογή που φτιάχνεις, χρειάζονται να είναι εγκατεστημένα και στον κάθε υπολογιστή όπου θα τρέξει η εφαρμογή. Είναι σαν την Java – για να τρέξεις ένα πρόγραμμα Java _συνήθως_ χρειάζεσαι και το “πακέτο” της Java.

    Τονίζω το συνήθως γιατί υπάρχει και η δυνατότητα να προσθέσεις στο πρόγραμμά σου τις βιβλιοθήκες της Qt που απαιτεί, και έτσι να μην χρειάζεται να εγκαθιστάς κάθε φορά όλo το toolkit [1] σε κάθε άλλον υπολογιστή. Αυτό κάνουμε και με την Windows έκδοση του SocNetV [2] που είναι μεν γραμμένο σε Qt, αλλά δεν χρειάζεται ο χρήστης να έχει εγκαταστήσει το Qt στα Windows του – έχουμε απλά αντιγράψει τις 4-5 βιβλιοθήκες DLL που χρειαζόμαστε από το Qt μέσα στο φάκελο του SocNetV και τα διανέμουμε όλα μαζί “πακέτο”.

    [1] http://qt.nokia.com/downloads/windows-cpp
    [2] http://sourceforge.net/projects/socnetv/

  13. Καλησπέρα Δημήτρη. Έχω αρκετή εμπειρία με Qt/C++ στο Λίνουξ και όσον αφορά το core, αλλά τώρα τελευταία αναπτύσσω μία εφαρμογή για διαχείριση δανείων και το πρόβλημα είναι ότι πρέπει να συνδέσω το client app με ένα mySQL cluster 10 κόμβων αλλά θέλω να γίνεται μέσω mingw και Qt MySQL driver και όχι μέσω libmysqlclient σε win32. Θα ήθελα να σε ρωτήσω μήπως έχεις έτοιμα DLL binaries για τον MySQL driver του SQL Qt module, αν είναι δυνατόν για win32 x64!? Σήμερα προσπαθησα να κάνω compile τους δικούς μου drivers αλλά παίρνω fatal errors και κάνω παράλληλα αλλαγές στο core source distribution μπας και το καταφέρω να κάνει compile!

  14. Επίσης να σημειώσω ότι κάνω link με τα binaries του Qt v2009.05!

  15. Λυπάμαι πολύ, Σωτήρη, δεν μπορώ να σε βοηθήσω άμεσα. Αυτόν τον οδηγό τον έχεις υπόψη σου φαντάζομαι:

    http://www.jiggerjuice.net/software/qt-sql-drivers.html

Leave a Reply

Creative Commons License
Licensed under a Creative Commons Attribution-ShareAlike 4.0 International License - Powered by Linux