Ruum42-News

OpenVPN-Vortrag

Am Dienstag, den 26. Februar hat HPO einen Vortrag zum Thema OpenVPN gehalten. Hier finden sich die Skripte und Dokumentation dazu.

RSA-Vortrag

Am 9. April hat HPO einen Vortrag zum Thema RSA gehalten.

Veranstaltungen & News in 2012

  • Am Samstag, den 15. Dezember wurde in Bern der Chaos Computer Club Schweiz gegründet. Da der CCC-CH ein Verband von Vereinen mit dezentraler Organisation ist, haben wir bereits eine „CCC-CH Gruppe Ruum42“ gegründet. Jeder in der Umgebung St. Gallen mit Interesse an einer Mitgliedschaft beim CCC kann bei uns Mitglied werden.
  • Am Samstag, dem 27. Oktober fand im Ruum42 ab 14:00 Uhr ein Treffen zur Gründung des CCC Schweiz statt.
  • Am Mittwoch, dem 24. Oktober wurde der Verein Ruum42 gegründet.
  • Am 9. Oktober 2012 hielt Jan einen Vortrag zum Thema Fotoworkflow unter Linux. Da das Thema extrem umfangreich ist, wird es dazu vermutlich noch eine Fortsetzung geben.
  • Am 2. Oktober begann ein kleiner Qt Workshop. Der nächste Termin folgt noch…
  • Seit ein paar Wochen haben wir endlich auch das Standesgemässe Getränk im Sortiment: Club Mate.
  • Seit dem 13. September 2012 verfügt der Raum dank dem Einsatz von Wene über einen Internetzugang per VDSL
  • Am 25. September hielt Paul einen Vortrag zum Thema Java.
  • Am 11. September fand ein Vortrag zum Thema Git statt.
  • Am 7. August fand ein Vortrag zum Thema Qt statt.
  • Am 3. und 10. Juli fand ein Vortrag zum Thema PHP statt.
  • Am 19. Juni hielt Paul im Rahmen des Linuxtreffs einen Vortrag zum Thema Python.
  • Am 5. Juni fand im Rahmen des Linuxtreffs ein Vortrag zum Thema JavaScript statt.
  • Am 26. April haben wir endlich die neue Türe bekommen. Leider ohne das elektronische Schloss, so dass wir uns da noch etwas einfallen lassen müssen…
  • Am Dienstag Abend, dem 3. April war Tag der offenen Kellertür.
  • Wir sind auf der Suche nach diesen Sachen: Gesuchte Sachen

QT Workshop

Der Qt Vortrag fand am 7. August statt. Das Thema war eine kurze Einführung in die Fähigkeiten und den Umfang des C++ Frameworks Qt. Die Präsentation kann hier heruntergeladen werden: 

Übungen

FIXME Die Übungen müssen hier noch eingefügt und beschrieben werden…

HELLO WORLD

#include <QApplication>
#include <QtGui>
 
int main(int argc, char *argv[])
{
        QApplication app(argc, argv);
        QPushButton *MyButton = new QPushButton("Hello World");
        MyButton->resize(120,50);
        MyButton->show();
        return app.exec();
}

Kompilieren per Dreisatz:

qmake -project
qmake
make

LAYOUT

GRUNDLAGEN

Layouts können ineinander verschachtelt werden. Die wichtigsten Layouts sind:

  • QVBoxLayout
  • QHBoxLayout
  • QGridLayout

Einem QWidgetwird ein Layout per setLayout() zugewiesen. Ebenfalls kann bei der Erstellung des Layouts das Elternwidget im Konstruktor übergeben werden.

QWidgets werden mit der Methode addWidget() zu Layouts hinzugefügt, Layouts per addLayout()

BEISPIEL

main.cpp

#include <QtGui/QApplication>
#include "mainwidget.h"
 
int main(int argc, char *argv[])
{
    //Mit dieser Zeile können im Quelltext innerhalb tr() auch UTF-8 Zeichen enthalten sein.
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
 
    //Standard aus der Qt-Creator Vorlage
    QApplication a(argc, argv);
    MainWidget w;
    w.show();
    return a.exec();
}

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H
 
//Es empfiehlt sich hier <QtGui/QWidget> durch <QtGui> zu ersetzen
#include <QtGui>
 
class MainWidget : public QWidget
{
    Q_OBJECT
//Das obenstehende Makro Q_OBJECT ist für Ableitungen von QWidget erforderlich
 
//Hier werden alle GUI Objekte deklariert
private:
    QVBoxLayout *MainLayout;
    QHBoxLayout *LayEdit;
    QLabel *LblHello;
    QLineEdit *EdtLine1, *EdtLine2;
    QPushButton *BtnQuit;
 
public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();
};
 
#endif // MAINWIDGET_H

mainwidget.cpp

#include "mainwidget.h"
 
MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle(tr("Demo Layout"));   //Gewöhnt euch an immer tr() zu verwenden für Strings in QObject
 
    //Erstellen
    MainLayout = new QVBoxLayout(this);
    LayEdit = new QHBoxLayout();
    LblHello = new QLabel(tr("<p>Hallo<br /><b>Wält</b></p>"));
    BtnQuit = new QPushButton(tr("Beend&en"));
    EdtLine1 = new QLineEdit();
    EdtLine2 = new QLineEdit();
 
    //Layout
    MainLayout->addWidget(LblHello);
    MainLayout->addLayout(LayEdit);
    LayEdit->addWidget(EdtLine1);
    LayEdit->addWidget(EdtLine2);
    MainLayout->addWidget(BtnQuit);
 
    //Signals and slots
    connect(BtnQuit, SIGNAL(clicked()), this, SLOT(close()));
    connect(EdtLine1, SIGNAL(textChanged(QString)), EdtLine2, SLOT(setText(QString)));
    connect(EdtLine2, SIGNAL(textChanged(QString)), EdtLine1, SLOT(setText(QString)));
}
 
MainWidget::~MainWidget()
{
 
}
 

SIGNALS UND SLOTS

FIXME Inhalt fehlt noch. Wird während oder nach dem nächsten Workshop Teil ergänzt. :-D

TIPPS UND TRICKS

UTF-8 STRINGS IM QUELLCODE

Damit Strings in Unicode im Quellcode auch richtig verarbeitet werden, kann die folgende Zeile in main() eingefügt werden. Bedingung ist natürlich, dass die Strings in tr() gekapselt sind. Dies ist aber unabhängig davon sowieso zu empfehlen damit spätere Übersetzungen des Programms möglich werden.

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

ÜBERSETZUNG VON STANDARDELEMENTEN

Diverse Widgets enthalten vordefinierte Texte auf welche man keinen Einfluss hat. Beispiele dafür sind Buttons in QMessageBox und das Kontextmenü in QTextEdit. Egal welche Sprache auf dem System eingestellt ist, diese Texte sind englisch.

Qt bietet für diese Elemente eigene Übersetzungsdateien. Diese können wie eigene Übersetzungen mit QTranslator geladen werden.

Für Programme welche dynamisch gelinkt werden, sollten die Übersetzungen auch dynamisch geladen werden. Wenn das Programm allerdings statisch kompiliert wird, sollten auch die Übersetzungen per Ressourcendatei eingebunden werden.

Innerhalb von main() wird die Übersetzung z.B. so dynamisch geladen:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
 
    QTranslator translator;
    translator.load("qt_de", QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    app.installTranslator(&translator);
 
    MainWidget w;
    w.show();
    return app.exec();
}

Statisch kompilierte Programme sollten die Übersetzung hingegen so laden:

translator.load("qt_de", ":/system");

Die Übersetzungsdatei „qt_de.qm“ muss dafür natürlich in das Projektverzeichnis kopiert und in eine Ressourcendatei eingebunden werden. Natürlich kann auch die zu verwendende Sprache dynamisch mit QLocale::system().name() ermittelt werden. Wenn keine Datei mit passenden Namen gefunden wird, startet das Programm ohne Fehlermeldung in englisch.

SPEZIALITÄTEN FÜR WINDOWS

Wer Programme auch für Windows entwickeln möchte, sollte ein paar Sonderheiten dieser Plattform beachten.

PROGRAMMSYMBOL

Symbole welche zur Laufzeit mit setWindowIcon() geladen werden, werden nicht als Symbol der EXE Datei angezeigt. Die folgende Anleitung erklärt wie dies gemacht wird: http://qt-project.org/doc/qt-5.0/appicon.html

STATISCH KOMPILIEREN

Um Programme unter Windows weitergeben zu können ohne dass sich der Empfänger gleich Qt komplett installieren muss, kann es hilfreich sein diese Programme statisch zu kompilieren. Dafür ist eine angepasste Version der Qt Bibliotheken erforderlich. Diese muss man selbst kompilieren. Eine Anleitung dazu gibts hier: http://qt-project.org/wiki/Build_Static_Qt_For_Windows_With_Gcc_German

Java-Vortrag

Am 25. September 2012 hielt Paul einen Vortrag zum Thema Java. Dazu gibt es  Slides und Beispielcode.

Git-Vortrag

Am 11. September hielt HPO einen Vortrag zur populären Versionsverwaltung Git: git.odp

Die empfohlenen Aliasse waren (Tip: https://git.wiki.kernel.org/index.php/Aliases):

  sta   = status -s
  lol   = log --oneline --graph --decorate=short --abbrev-commit 
(noch gepimpter: [[http://www.jukie.net/bart/blog/pimping-out-git-log]])
  pul   = pull --ff-only

Python-Vortrag

Am 19. Juni 2012 hielt Paul einen Vortrag zum Thema Python. Die Präsentation kann hier heruntergeladen werden: pythonvortrag.zip

Javascript-Vortrag

Am 5. Juni 2012 fand ein Vortrag zum Thema JavaScript statt. Die Präsentation gibt es hier zum Download:  javascriptvortrag.zip

Seiten