Archive

Posts Tagged ‘C’

C++: Qt and SQL

February 18, 2010 Leave a comment

Today I want to write something about Qt and its SQL-support. It is quite easy to use it, much more simple than working directly with ODBC and/or SQLite or other libraries because Qt has “build-in” support, you just have to add QT += sql to your .pro-file and specify which library you want to work with.

But let’s start now. I want to demonstrate how easy it is to create a simple timetable with SQLite that looks something like this if you wrap it into a GUI:

Here are the includes:

#include <QTableView>
#include <QSqlDriver>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlTableModel>
// #include <QSqlError>

At first, create the database using SQLite via

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("databaseName");

Then open it (and check it meanwhile) with

if(!db.open()) {
   exit(0); // or do something else
}

Now insert the table using a SQL query:

QSqlQuery query;
query.exec("CREATE TABLE IF NOT EXISTS tableName ("
           "monday varchar(200), "
           "tuesday varchar(200), "
           "wednesday varchar(200), "
           "thursday varchar(200), "
           "friday varchar(200), "
           "saturday varchar(200), "
           "sunday varchar(200))");

After that create a model:

QSqlTableModel model;
model.setTable("tableName");
model.setEditStrategy(QSqlTableModel::OnManualSubmit);

If you choose “OnManualSubmit” as edit strategy you have to save the changes you make inside the model by your own (explanation comes later).
Then set the model header data (Monday-Sunday in the picture):

model.setHeaderData(0, Qt::Horizontal, "Monday");
model.setHeaderData(1, Qt::Horizontal, "Tuesday");
model.setHeaderData(2, Qt::Horizontal, "Wednesday");
model.setHeaderData(3, Qt::Horizontal, "Thursday");
model.setHeaderData(4, Qt::Horizontal, "Friday");
model.setHeaderData(5, Qt::Horizontal, "Saturday");
model.setHeaderData(6, Qt::Horizontal, "Sunday");

and set the model to the view to display it:

model.select();
QTableView view;
view.setModel(model);

But what if you want to add an additional line with an entry in every row? The best news is that you don’t have to write any SQL for adding or deleting if you don’t want to:

int rowCnt = model.rowCount();
model.insertRow(rowCnt);
for(int i = 0; i < model.columnCount(); i++) {
   model.setData(model.index(rowCnt, i), "Put this Entry in every Row");
}
model.submitAll();
model.select();
view.setModel(model);

And if you want to delete the last row:

model.removeRow(model.rowCount() - 1);
model.submitAll();
model.select();
view.setModel(model);

You have to call “submitAll” because of the selected strategy “OnManualSubmit” that doesn’t save by it’s own.
To clear the whole database, drop the table by querying

query.exec("DROP TABLE IF EXISTS tableName");

After setting up a model and a view you can change your table inside the view, press “save” and everything else is “done by Qt”!

You can find the whole Application at CallToPower – Software – qTimeTable, have fun experimenting with it!

Java, C++: ClassLoader and Qt Resource System

December 8, 2009 Leave a comment

Here a little comparison between the Java ClassLoader and the Qt Resource System:
If you want to load an icon and/or an image e.g. in a Java .jar-file you have to do it this way:

Icon icon;
Image image;
ClassLoader CLDR = this.getClass().getClassLoader();
String path = "src/to/images/name.png";
URL url = CLDR.getResource(path);
// An icon
if (!(url == null)) {
    icon = new ImageIcon(url);
}
// An image
try {
    image = ImageIO.read(CLDR.getResource(path));
} catch (IOException e) {
    // ExceptionHandling here
}

In Qt there is another approach:
The resources associated with an application are specified in a XML-based .qrc-file.
The specified paths are relative to the directory containing the .qrc-file (listed files must be located in the same directory or any sub-directory).
In the source-code the resources are accessible under the same name they have in the source tree, with a “:/” prefix.
Here an example:

<RCC>
    <qresource prefix="/dir/subDir" lang="en">
        <file alias="AliasName">subDir/FileName<file>
    <qresource>
</RCC>

In your source code you can access FileName (if FileName e.g. is a QFile) via

QFile file(":/dir/subdir/AliasName");

after adding the following line to your .pro-file:

RESOURCES = yourRsrcFileName.qrc

The option lang=”langCode” (here: “en”) is for the localization:
If you want to add another language to your application you have to have the file “AliasName_langCode” in your source tree.

And, of course, you don’t have to write the ressource file on your own if you use the QtCreator, there is a nice GUI included.

SICK Robot Day 2009

October 3, 2009 3 comments

Today’s the SICK Robot Day 2009 (Link1 | Link2).
I worked on it for the University of Osnabrueck.
Our Robot named KURT avoids collisions, respects the rule “left yields right”, is able to detect numbers as well as markers and drives to the right numbers from 0-9 and/or vice versa.
So…good luck to everyone in Waldkirch.
Here some photos of Kurt2 at our self-made parcours:
kurt2_2 kurt2_1

And some Videos:

C++: Qt: "qBaseConverter"

August 17, 2009 Leave a comment

Today I implemented a Base Converter in C++ using Qt and after about 15 Minutes first successes have become apparent. You can convert from any Base you want to to any Base you want to (you only have to fix the “Number of Bases”-Variable if the default 30 Bases aren’t enough for you):

qBaseConverter

The basic Function (Slot) is – guess – “void convert()” that gets a Signal whenever a ComboBox or the Text at the LineEdit gets changed:

bool BaseConverter::getInputNumber(long long &number, int base) {
    bool ok;
    // Get Input-Number
    number = ui->lineEdit_input->text().toULongLong(&ok, base);
    // Return if Conversion ok
    return ok;
}
void BaseConverter::convert() {
    // Base to convert from
    int baseFrom = ui->comboBox_choiceFrom->currentIndex() + 2;
    // Base to convert to
    int baseTo = ui->comboBox_choiceTo->currentIndex() + 2;

    long long number;
    // If there is a valid Input
    if(getInputNumber(number, baseFrom)) {
        // Display the converted Number
        ui->lineEdit_output->setText(QString::number(number, baseTo));
    }
}
Follow

Get every new post delivered to your Inbox.