dimitris kalamaras

math, social network analysis, web dev, free software…

Qt (Μέρος IΙ): Βάσεις δεδομένων

Σε αυτό το tutorial, στόχος μας είναι να φτιάξουμε μια εφαρμογή που να αλληλεπιδρά με τη MySQL. Η Qt υποστηρίζει αρκετές βάσεις δεδομένων (MySQL, PostgreSQL, SQLite), αλλά εδώ θα περιοριστούμε στην MySQL.

Στο παράδειγμα που θα δούμε παρακάτω, θα φτιάξουμε2008/08/02/qt-μέρος-ι-convertor/#content μια εφαρμογή διαχείρισης βιβλίων, το bookAdmin. Η υλοποίηση του όμως θα είναι αρκετά γενική ώστε να μπορείτε να το προσαρμόσετε εύκολα στις δικές σας ανάγκες. Με μερικές αλλαγές στο περιβάλλον της εφαρμογής θα μπορείτε, αντί για βιβλία, να διαχειρίζεστε CDs, ταινίες, γραμματόσημα, οτιδήποτε. Θυμίζω ότι βασιζόμαστε στην Qt 4.2+ οπότε, ανάλογα με τη διανομή σας, θα πρέπει να έχετε ήδη εγκαταστήσει τα πακέτα ανάπτυξης της Qt4 (δείτε το πρώτο tutorial). Επιπλέον, επειδή θα δουλέψουμε με βάσεις δεδομένων, θα πρέπει να εγκαταστήσετε και το πακέτο libqt4-sql στο Debian/Ubuntu (ή το qt4-database-plugin-mysql-lib στο PCLinuxOS). Κατά τ’ άλλα, θα αρκεστούμε και πάλι στo Qt Designer και σε ένα κειμενογράφο.

Δημιουργία GUI

Αρχικά θα φτιάξουμε το GUI του bookAdmin. Τρέξτε λοιπόν το QtDesigner. Στην ερώτηση για το είδος της φόρμας, επιλέξτε “Main Window” μια και αυτή τη φορά θέλουμε να φτιάξουμε μια κανονική εφαρμογή. Στο προηγούμενο τεύχος είχαμε προτιμήσει το Widget, μια και τότε θέλαμε μόνο ένα λιτό διάλογο με μερικά μόνο πεδία για την εισαγωγή και προβολή των μονάδων. Το bookAdmin όμως θα είναι πολύ πιο περίπλοκη εφαρμογή, γι’ αυτό προτιμάμε το MainWindow.

Πως θα είναι το περιβάλλον του bookAdmin; Σε γενικές γραμμές, θα αποτελείται από ένα μενού στην κορυφή και ένα Tabbed Widget στο κέντρο, δηλαδή θα έχει καρτέλες όπως ο Firefox. Θα χρειαστούμε δύο καρτέλες. Στην πρώτη, θα έχουμε την φόρμα εισαγωγής στοιχείων, ενώ στη δεύτερη θα υπάρχει ένα Table View widget, δηλαδή κάτι σαν λογιστικό φύλλο όπου ο χρήστης του bookAdmin θα μπορεί να βλέπει όλα τα βιβλία (ή CDs ή οτιδήποτε άλλο) έχει εισάγει στη βάση δεδομένων.

Δημιουργία φόρμας

Ξεκινάμε λοιπόν! Πρώτα εισάγετε ένα Tab Widget από τα Containers. Μεγαλώστε το αρκετά (από τα μπλε χειριστήρια) ώστε να καλύψει σχεδόν το κενό τμήμα της φόρμας. Ύστερα κάντε κλικ στο κάτω-κάτω μέρος της φόρμας (όχι στο Tab Widget) και πατήστε Ctrl+Ο για να δημιουργήσετε ένα Grid Layout. Έτσι το Tab Widget θα μπει αυτόματα σε ένα αόρατο πλέγμα, με αποτέλεσμα να αλλάζει αυτόματα μέγεθος όταν ο χρήστης αλλάζει το μέγεθος του παραθύρου.

Ύστερα εισάγετε στην πρώτη καρτέλα πέντε πεδία Line Edit, από το Input Widgets. Σε κάθε ενα από αυτά, ο χρήστης του bookAdmin θα εισάγει το όνομα του βιβλίου, τον συγγραφέα, το ISBN, την τιμή και τις σελίδες. Βάλτε ακόμα ένα Line Edit – σε αυτό θα γράφουμε την αξιολόγηση κάθε βιβλίου (έναν αριθμό από το 1 έως το 5). Εφόσον βάλαμε τελικά έξι Line Edits, θα χρειαστούμε και έξι Labels, για ετικέτες σε αυτά τα πεδία. Προσθέστε τα, από τα Display Widgets, ώστε κάθε Label να βρίσκεται πάνω ή δίπλα από ένα πεδίο Line Edit (στις εικόνες μπορείτε να δείτε πως τα έβαλα εγώ – εσείς κάντε ότι σας αρέσει!). Μετά προσθέστε ακόμα ένα Label στην κορυφή της καρτέλας. Αυτό θα είναι ο τίτλος της καρτέλας, π.χ. “Καταχώρηση βιβλίου”.

Εντάξει; Ας αλλάξουμε τα ονόματα των πεδίων και τις περιγραφές των ετικετών σε κάτι πιο χρήσιμο. Κάντε δεξί κλικ > Change Object Name στα πεδία Line Edit και βάλτε τα ονόματα titleLE, authorLE, isbnLE, pagesLE, priceLE, και ratingLE. Αντίστοιχα, στο Label κάθε πεδίου κάντε δεξί κλικ > Change plaint text και γράψτε: Τίτλος, Συγγραφέας, ISBN, Σελίδες, Τιμή, Βαθμολογία. Στο Label της κορυφής, κάντε δεξί κλικ > Change rich text και γράψτε “Καταχώρηση βιβλίου” μεγαλώνοντας τη γραμματοσειρά. Τώρα, η φόρμα πρέπει να έχει αποκτήσει μια λογική.


Προσοχή: τα ονόματα titleLE, authorLE, κλπ, των πεδίων και του κουμπιού είναι πολύ σημαντικά. Αν βάλετε διαφορετικά θα πρέπει να αλλάξετε και τις αντίστοιχες γραμμές του κώδικα! Διαφορετικά η εφαρμογή δεν θα βρίσκει τα widgets στη φόρμα και δεν θα τρέχει!

Λείπει όμως ένα κουμπί για την εκτέλεση της καταχώρησης – πως θα ξέρει το πρόγραμμα ότι ο χρήστης έγραψε τα στοιχεία και τώρα θέλει να τα εισάγει στη βάση δεδομένων. Γι’ αυτό, από τα Buttons, σύρετε ένα PushButton. Δεξί κλικ πάνω του και πρώτα αλλάξτε το όνομα (Change object name) σε enterBt και μετά αλλάξτε την ετικέτα του (Change text) σε “Εισαγωγή”.

Διαρρύθμιση

Έχουμε σχεδόν τελειώσει με αυτήν την καρτέλα. Μένουν όμως δύο σημαντικά πράγματα. Πρώτον, να “ταιριάξουμε” κάθε ετικέτα με το αντίστοιχο πεδίο της (ουσιαστικά φτιάχνοντας 6 ομάδες με δυο αντικείμενα σε κάθε μία) και δεύτερον να εισάγουμε spacers ανάμεσα στις ομάδες, ώστε η διαρρύθμιση που έχουμε επιλέξει για τα διάφορα αντικείμενα της καρτέλας να παραμένει σταθερή σε κάθε πιθανή αυξομείωση του παραθύρου από τον χρήστη.

Αυτά τα δύο πράγματα είναι σχετικά εύκολα. Πατώντας το Shift, κάντε αριστερό κλικ σε ένα πεδίο και την αντίστοιχη ετικέτα του (για να επιλέξτε και τα δύο) και μετά κάντε δεξί κλικ και επιλέξτε Layout > Layout Vertically. Θα εμφανιστεί ένα κόκκινο παραλληλόγραμμο πλαίσιο γύρω από τα δύο widgets, που δηλώνει ότι πλέον συγκροτούν μια ενιαία ομάδα στοιχείων. Κάντε το ίδιο για όλα τα πεδία. Τέλος, σύρετε κάθε ομάδα στα σημεία τις καρτέλας όπου θέλετε να εμφανίζονται. Προτείνω να έχετε δύο ομάδες σε κάθε νοητή “γραμμή” της φόρμας. Βάλτε το κουμπί “Εισαγωγή” στο κάτω μέρος (δείτε τις εικόνες).

Τώρα, για να διατηρείται αναλλοίωτη η διαρρύθμιση των widgets, πρέπει να βάλετε οριζόντια spacers ανάμεσα στις ομάδες κάθε “γραμμής”. Για παράδειγμα, αν στην πρώτη γραμμή έχετε τις ομάδες με τα πεδία και τις ετικέτες για τον τίτλο και τον συγγραφέα, τότε σύρετε ένα Horizontal Spacer στο δεξί άκρο της γραμμής και μεγαλώστε το αρκετά. Μετά, πατώντας το Shift, κάντε αριστερό κλικ σε κάθε ένα spacer και κάθε μία ομάδα (προσοχή: κάντε κλικ στο κόκκινο πλαίσιο της!) ώστε να επιλεγούν όλα και μετά με δεξί κλικ επιλέξτε Layout > Layout Horizontally. Ένα μεγαλύτερο κόκκινο πλαίσιο θα περιβάλλει πλέον όλα τα widgets αυτής της “γραμμής”. Κάντε το ίδιο για όλες τις “γραμμές” της φόρμας και προφανώς και για τον τίτλο αλλά και για το κουμπί που βρίσκεται στο κάτω μέρος.

Εντάξει, την πρώτη φορά που θα κάνετε τα παραπάνω θα σας φανούν δύσκολα, αλλά με μερικές δοκιμές θα τα καταφέρετε (κι εγώ είχα προβλήματα να το καταλάβω στην αρχή!). Αν ακολουθήσατε τις οδηγίες κατά γράμμα, τότε θα έχετε μία καρτέλα με 5 οριζόντιες γραμμές. Τώρα, πατώντας το Shift, κάντε αριστερό κλικ και επιλέξτε ένα προς ένα το μεγαλύτερο κόκκινο πλαίσιο κάθε “γραμμής” και μετά δεξί κλικ και από το μενού επιλέξτε Layout > Layout Vertically. Αυτόματα, το Qt Designer θα βάλει όλες τις γραμμές με τα στοιχεία της καρτέλας σε μια κατακόρυφη σειρά. Από τα μπλε χειριστήρια, μεγαλώστε την ώστε να καλύψει όλη την καρτέλα. Τελειώσαμε εδώ. Πατήστε Ctrl+R για να δείτε το αποτέλεσμα και Ctrl+S για αποθήκευση.

Δεύτερη καρτέλα

Στο δεύτερη καρτέλα θα προσθέσουμε ένα TableView. Κάντε κλικ στη δεύτερη καρτέλα της φόρμας, ώστε να ανοίξει, και μετά τραβήξτε το αντικείμενο “Table View” από την εργαλειοθήκη του Qt Designer (βρίσκεται στα Item views). Μεγαλώστε αρκετά ώστε να καλύψει σχεδόν όλη την καρτέλα και μετά κάντε δεξί κλικ σε ένα κενό σημείο της καρτέλας και από το μενού Layout επιλέξτε το Layout in a grid. Πατήστε Ctrl+R για δοκιμή. Τέλος, πατήστε Ctrl+S και αποθηκεύστε την φόρμα με το όνομα bookadminform.ui.

Πηγαίνετε στο φάκελο όπου την αποθηκεύσατε και ανοίξτε το αρχείο bookadminform.ui με έναν editor. Στην αρχή του, θα δείτε τις γραμμές

 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow" >

Αλλάξτε τις ώστε να είναι:

 <class>bookAdminForm</class>
 <widget class="QMainWindow" name="bookAdminForm" >

και αποθηκεύστε το.

Δημιουργία βάσης

Η βάση δεδομένων που θα χρησιμοποιήσουμε στο BookAdmin θα λέγεται booksdb. Πρέπει να την δημιουργήσουμε όμως, χειροκίνητα, επειδή η Qt και κατ’ επέκταση το BookAdmin μπορεί να συνδέεται μόνο με υπαρκτές βάσεις δεδομένων MySQL (δεν μπορεί να φτιάξει μια καινούρια). Γι’ αυτό συνδεθείτε στην κονσόλα της MySQL, δίνοντας π.χ.:

mysql -udimitris -p

και τον κωδικό σας και στο prompt δώστε την εντολή:

CREATE DATABASE bookdb 
DEFAULT CHARACTER SET utf8 
COLLATE utf8_  unicode_ci;

Με αυτήν, φτιάχνουμε μια βάση δεδομένων με όνομα bookdb η οποία θα έχει κωδικοσελίδα UTF8, μια και θέλουμε να καταχωρούμε τίτλους και συγγραφείς (και) με Ελληνικούς χαρακτήρες. Έπειτα δώστε την εντολή:

CREATE TABLE books (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
title VARCHAR(20), author VARCHAR(20), isbn INT, pages INT, 
price FLOAT, rating INT);

Με αυτήν, δημιουργούμε τον πίνακα books, τον μοναδικό της βάσης booksdb. Σε αυτόν τον πίνακα θα καταχωρούμε τα βιβλία.

Ο κώδικας

Μέχρι τώρα, φτιάξαμε το γραφικό περιβάλλον της εφαρμογής και δημιουργήσαμε τη βάση δεδομένων και τον βασικό πίνακα. Είμαστε έτοιμοι να δούμε τον κώδικα του BookAdmin. Όπως την προηγούμενη φορά, θα φτιάξουμε τρία αρχεία, στον ίδιο φάκελο που έχουμε αποθηκεύσει το αρχείο της φόρμας: main.cpp, bookadmin.h, και bookadmin.cpp. Τέλος, θα φτιάξουμε το αρχείο του project, το bookadmin.pro. Πριν τα δούμε αυτά όμως πρέπει να πούμε μερικά πράγματα για τις SQL κλάσεις της Qt, για να καταλαβαίνετε τι γίνεται.

H Qt προσφέρει αρκετές κλάσεις για το χειρισμό βάσεων δεδομένων. Πριν μπορέσουμε να τις χρησιμοποιήσουμε όμως, πρέπει να έχουμε δημιουργήσει μια σύνδεση με κάποια υπαρκτή βάση δεδομένων. Αυτό γίνεται μέσω της κλάσης QSqlDatabase, η οποία υποστηρίζει MySQL, SQLite, PostgreSQL, Oracle κά. Στη συνέχεια, η αλληλεπίδραση με την βάση μας γίνεται συνήθως με μεθόδους της κλάσης QSqlQuery. Τέλος, η Qt μας δίνει τρεις κλάσεις για την προβολή των δεδομένων στο γραφικό περιβάλλον: QSqlQueryModel, QSqlTableModel και QSqlRelationalTableModel. Εμείς θα χρησιμοποιήσουμε τη δεύτερη. Στην πράξη για να χρησιμοποιήσουμε βάσεις δεδομένων στην Qt, θα πρέπει να προσθέσουμε τη γραμμή:

QT+=sql

στο .pro αρχείο κάθε project μας. Επίσης πρέπει να εισάγουμε τις διάφορες κλάσεις στον κώδικα μας με την ντιρεκτίβα:

#include <QtSql>

Θυμίζω: τo main.cpp είναι το βασικό αρχείο κάθε εφαρμογής C++/Qt και εκεί ορίζεται η κλάση main(). Γράψτε τις παρακάνω γραμμές σε έναν κειμενογράφο και αποθηκεύστε το αρχείο main.cpp:

#include "bookadmin.h"
 
int createConnection (){
	QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
	db.setHostName("localhost");
	db.setDatabaseName("booksdb");
	db.setUserName("dimitris");
	db.setPassword("ΣΥΝΘΗΜΑΤΙΚΟ");
	bool ok = db.open();
	if (!ok) {
		qDebug()<<"Warning. Can't open DB. Aborting...";
		return false;
	}
	return ok;
}
 
int main(int argc, char *argv[]) {
	QApplication app(argc, argv);
	if (!createConnection())  return 1;
	BookAdmin bookadmin;
	bookadmin.show();
	return app.exec();
}

Μερικές εξηγήσεις. H συνάρτηση createConnection δημιουργεί τη σύνδεση με τη βάση δεδομένων booksdb (που πρέπει να υπάρχει!) της MySQL και επιστρέφει True αν πετύχει, False αν αποτύχει. Αν αποτύχει, τερματίζουμε το πρόγραμμα (return 1), μια και δεν θα μπορούμε αν το χρησιμοποιήσουμε. Στην 4η γραμμή δημιουργούμε το αντικείμενο db με τη μέθοδο addDatabase της κλάσης QSqlDatabase. Με αυτό το αντικείμενο γίνεται όλη η σύνδεση: ορίζουμε το server (setHostName), το όνομα της βάσης (setDatabaseName), το χρήστη της MySQL (setUserName) και φυσικά τον κωδικό του (setPassword). Μετά κάνουμε έναν έλεγχο (db.open()) αν άνοιξε σωστά η βάση, και επιστρέφουμε την ανάλογη τιμή.

Στα άλλα δύο αρχεία ορίζουμε το API και τις μεθόδους της εφαρμογής μας στην κλάση BookAdmin. Να ο κώδικας του bookadmin.h:

#ifndef BOOKADMIN_H
#define BOOKADMIN_H
#include <QtSql>
#include "ui_bookadminform.h"
 
class BookAdmin : public QMainWindow {
    Q_OBJECT
public:
	BookAdmin();
	bool initDB ();
	QTableView *initTableView(const QString &title, 
QSqlTableModel *model);
	void initModel( QSqlTableModel *model);
private slots:
	void submit();
private:
	Ui::bookAdminForm ui;
	QSqlTableModel model;
};
#endif

Στην 3η γραμμή εισάγουμε το QtSQL module (δηλαδή όλες τις σχετικές με SQL κλάσεις της Qt) και μετά εισάγουμε το αρχείο ui_bookadminform.h (αυτό παράγεται αυτόματα όταν δίνουμε την εντολη qmake από το bookadminform.ui). Έπειτα ορίζουμε την βασική (και μόνη) κλάση BookAdmin της εφαρμογής. Η BookAdmin έχει τέσσερις δημόσιες μεθόδους: την BookAdmin (για αρχικοποίηση της εφαρμογής), την initDB (για αρχικοποίηση της βάσης), την initTableView και την initModel. Στις δύο τελευταίες θα υλοποιήσουμε την δική μας εκδοχή του Model/View framework της Qt. Με απλά λόγια, το Model (μοντέλο) αντιστοιχεί στα δεδομένα που παίρνει από μία βάση δεδομένων, ενώ το View είναι η προβολή τους σε κάποιο widget της εφαρμογής. Αυτό το widget θα είναι το TableView που φτιάξαμε στην φόρμα. Επίσης η κλάση μας έχει δύο ιδιωτικά μέλη: το αντικείμενο ui της bookAdminForm και το μοντέλο model όπου θα φορτώνουμε τα δεδομένα.

Ας δούμε τώρα μία προς μία τις υλοποιήσεις κάθε δημόσιας μεθόδου. H υλοποίηση γίνεται στο αρχείο bookadmin.cpp. Ας δούμε πρώτα την constructor μέθοδο της κλάσης BookAdmin:

#include <QtGui>
#include "bookadmin.h"
#include <QtSql>
 
BookAdmin::BookAdmin() {
        ui.setupUi(this);
	connect (ui.enterBt,SIGNAL(clicked()), this,SLOT(submit()));
	initModel(&model);
	QTableView *view1 = 
initTableView(QObject::tr("Database"), &model);
	view1->show();
	this->setWindowTitle("BookAdmin");
	this->resize(800,600);
	ui.tabWidget->setCurrentIndex(0);
}

Στην 1η γραμμή της μεθόδου BookAdmin λέμε στην Qt να ρυθμίσει το γραφικό περιβάλλον της εφαρμογής (στο αντικείμενο ui) ώστε να μπορούμε να έχουμε πρόσβαση στα διάφορα στοιχεία της φόρμας (πεδία, κουμπιά, κλπ). Μετά, συνδέουμε το κουμπί Εισαγωγής με τη μέθοδο submit() και τέλος δημιουργούμε ένα νέο δείκτη σε ένα αντικεόμενο QTableView, το view1, το οποίο αρχικοποιούμε με την μέθοδο initTableView, την οποία καλούμε εκείνη τη στιγμή. Τέλος, αλλάζουμε το μέγεθος του παράθυρου και ορίζουμε να εμφανίζεται αρχικά η πρώτη καρτέλα της φόρμας (setCurrentIndex(0)).

Η initTableView() είναι μια απλή μέθοδος που κάνει όμως πολύ δουλειά! Να ο κώδικας της:

QTableView *BookAdmin::initTableView(
const QString &title, QSqlTableModel *model)  
{
	ui.tableView->setModel(model);
	ui.tableView->setWindowTitle(title);
	return ui.tableView;
 }

Οι παράμετροί της είναι ο τίτλος που θέλουμε στο TableView και το μοντέλο model. Αυτές τις δύο παραμέτρους τις περνάμε στο tableView widget της φόρμας της εφαρμογής με τις μεθόδους setModel και setWindowTitle. Τέλος, επιστρέφουμε το tableView widget. Αυτό το κάνουμε ώστε ο δείκτης *view1 να αρχικοποιηθεί (ουσιαστικά να αντιστοιχιστεί η διεύθυνσή του) με το tableView της φόρμας.

Περνάμε τώρα στην submit() με την οποία παίρνουμε τα δεδομένα από τη φόρμα και τα υποβάλλουμε στη βάση δεδομένων:

void BookAdmin::submit() {
	QString title_str = ui.titleLE->text();
	QString author_str = ui.authorLE->text();
	QString isbn_str = ui.isbnLE->text();
	QString pages_str = ui.pagesLE->text();
	QString price_str = ui.priceLE->text();
	QString rating_str = ui.ratingLE->text();
 
	bool ok=false;
	int isbn= isbn_str.toInt(&ok);     
	if (!ok) return;
	int pages = pages_str.toInt(&ok);  
	if (!ok) return;
	float price= price_str.toFloat(&ok);
	if (!ok) return;
	int rating = rating_str.toInt(&ok);
	if (!ok) return;
 
	QSqlQuery query;
	query.prepare("insert into books (id,  title, author, isbn, 
pages, price, rating) values ('', :title, :author, :isbn, 
:pages, :price, :rating)");
	query.bindValue(":title", title_str);
	query.bindValue(":author", author_str);
	query.bindValue(":isbn", isbn);
	query.bindValue(":pages", pages);
	query.bindValue(":price", price);
	query.bindValue(":rating", rating);
 
	if(!query.exec() ) qDebug()<<"Couldnt execute 
SUBMIT query initiated by button.";
	initModel(&model);
}

Στις πρώτες 6 γραμμές παίρνουμε τα δεδομένα από τα πεδία και τα καταχωρούμε σε strings. Μετά στις γραμμές 8-16 μετατρέπουμε τα δεδομένα ISBN, Σελίδες, Τιμή και Βαθμολογία από strings σε ακέραιες και float τιμές. Για κάθε μετατροπή ελέγχουμε αν η “σημαία” ok είναι false. Αν είναι false, σημαίνει ότι δεν έγινε η μετατροπή οπότε τερματίζουμε την υποβολή. Όταν τελειώσουμε με τις μετατροπές, φτιάχνουμε το πρώτο μας query με την QSqlQuery και το ετοιμάζουμε με την prepare(). To SQL query:

insert into books (id,  title, author, isbn, pages, price, rating) 
values ('', :title, :author, :isbn, :pages, :price, :rating)

σημαίνει “βάλε στον πίνακα books και συγκεκριμένα στα πεδία id, title, isbn, pages, price, rating τις τιμές που ακολουθούν”. Για ευκολία δεν βάζουμε τιμές, αλλά binds, δηλαδή σύμβολα τα οποία αντιστοιχίζουμε σε τιμές, παρακάτω, με τις γραμμές query.bindValue(). Έτσι, π.χ. η εντολή

query.bindValue(":author", author_str);

σημαίνει αντιστοίχισε την τιμή του string author_str στο σύμβολο :author. Όμοια κάνουμε και για τις υπόλοιπες τιμές. Στο τέλος, εκτελούμε (query.exec) δηλαδή υποβάλλουμε το query στη MySQL και αν κάτι πάει στραβά τυπώνουμε ένα μήνυμα στην κονσόλα (δεν χρειάζεται να κάνουμε κάτι άλλο!). Τέλος καλούμε την initModel για να αρχικοποιήσουμε ξανά το μοντέλο με τα δεδομένα, που θα πάρουμε από τη βάση, τα οποία θα παρουσιάσουμε στο tableView widget του ui:

void BookAdmin::initModel(QSqlTableModel *model)  {
	model->setTable("books");
	model->removeColumn(0);
	model->select();
	model->setHeaderData(0, Qt::Horizontal, QObject::tr("Title"));
	model->setHeaderData(1, Qt::Horizontal, QObject::tr("Author"));
	model->setHeaderData(2, Qt::Horizontal, QObject::tr("ISBN"));
 	model->setHeaderData(3, Qt::Horizontal, QObject::tr("Pages"));
 	model->setHeaderData(4, Qt::Horizontal, QObject::tr("Price"));
 	model->setHeaderData(5, Qt::Horizontal, QObject::tr("Rating"));
}

Εδώ, θέτουμε στο μοντέλο model τον πίνακα books, απ’ όπου θα αντλήσει δεδομένα. Μετά αφαιρούμε από το μοντέλο με την removeColumn(0) την πρώτη στήλη (με τα IDs που είναι άχρηστα στο χρήστη). Έπειτα επιλέγουμε με την select() όλα τα δεδομένα που βρίσκονται στον πίνακα books και δίνουμε επικεφαλίδες σε κάθε στήλη δεδομένων του μοντέλου με τις setHeaderData().

Η εκτέλεση!

Αυτό ήταν. Το μόνο που μένει είναι να φτιάξουμε το αρχείο bookadmin.pro. Γράψτε εκεί τα εξής:

QT += sql
HEADERS     = bookadmin.h
FORMS       = bookadminform.ui
SOURCES     = main.cpp\
		bookadmin.cpp
<pre>
 
Τώρα από το τερματικό (στον φάκελο με τον κώδικα και το ui) δώστε: 
<pre lang="bash">
qmake-qt4

και μετά μεταγλωττίστε το πρόγραμμα με την εντολή:

make

Μόλις τελειώσει δώστε ./bookadmin για να το τρέξετε….

Αναδημοσίευση από το τεύχος 18 του Ελληνικού Linux Format

Previous

SocNetV gets a review (not bad one :))

Next

ITER: Ένας τεχνητός ήλιος!

3 Comments

  1. Nikos

    Erwtisi!

    Pes ginetai ayto to programma na trexei se opiodipote pc xwris na exei egatestimeni tin mysql?
    na ginei dld ena programmataki aytonomo?

  2. Νίκο, αν θες αυτονομία, μπορείς να χρησιμοποιήσεις άλλη βάση δεδομένων αντί της MySQL. Για παράδειγμα, η SQLite (που υποστηρίζεται από την Qt) δεν απαιτεί να υπάρχει server, μια και λειτουργεί σε ένα αρχείο, επομένως επιτρέπει να είναι 100% “αυτόνομο” το προγραμμά σου.

  3. II

    Des kai auto…

    Embedded MySQL Server

    The MySQL embedded server is a drop-in replacement for the normal client library. With the embedded MySQL server, a MySQL server is not required to use MySQL functionality.

    To use the embedded MySQL server, simply link the Qt plugin to libmysqld instead of libmysqlclient. This can be done by replacing -lmysqlclient_r by -lmysqld in the qmake command in the section below.

    Please refer to the MySQL documentation, chapter “libmysqld, the Embedded MySQL Server Library” for more information about the MySQL embedded server.

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Powered by WordPress & Theme by Anders Norén