Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: GUI programmeren  (gelezen 3854 keer)

Hans Kamp

  • Gast
GUI programmeren
« Gepost op: 2008/12/12, 19:42:24 »
Ik zou eens grafische programma's willen maken met de interface van Ubuntu. Zijn er links naar tutorials? Ik ben al behoorlijk bekend met C++ en Pascal.

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: GUI programmeren
« Reactie #1 Gepost op: 2008/12/12, 19:53:54 »
Je hebt verschillende opties, ik raad altijd Qt 4 aan..
Andere (GUI) toolkits zijn GTK+ (bv GNOME is hierin geschreven), wxWidgets (bv Audacity is hierin geschreven)...

Website: http://trolltech.com/
Wikipedia: http://en.wikipedia.org/wiki/Qt_(toolkit)#External_links
Documentatie: http://doc.trolltech.com/
Review (van versie 4.4): http://arstechnica.com/reviews/other/troll-treasure-qt44-in-depth.ars
Welke apps gebruiken Qt: http://trolltech.com/qt-in-use
GUI builder: standaard onderdeel van Qt zelf: Qt Designer (designer-qt4)
GUI look: integreert met het desktopthema van Windows, Mac OS X, KDE en GNOME/Xfce (vanaf versie 4.5 volledig dankzij QtGtkStyle)
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Hans Kamp

  • Gast
Re: GUI programmeren
« Reactie #2 Gepost op: 2008/12/12, 20:41:50 »
Bedankt.

Offline lordnoid

  • Lid
Re: GUI programmeren
« Reactie #3 Gepost op: 2008/12/12, 22:11:55 »
Als je met C++ en Qt4 wilt werken kun je ook eens Qt Creator proberen. Het is op het moment nog alpha (of beta?), maar het werkt wel goed en je kunt er enorm snel in programmeren.

Hans Kamp

  • Gast
Re: GUI programmeren
« Reactie #4 Gepost op: 2008/12/13, 09:05:09 »
Ik heb

qtcreator-0.9-linux-x86-setup.bin

gedownload. En dan? De rest van Qt heb ik ook al gedownload, gecompileerd en geïnstalleerd. De tutorial werkt, maar het probleem is dat ik zelf een Makefile moet maken. Dat zal met Qt Creator niet langer nodig zijn.

Zo op het eerste gezicht lijkt het op Borland C++Builder (de C++-variant van Delphi), maar dan voor Ubuntu.

Hans Kamp

  • Gast
Re: GUI programmeren
« Reactie #5 Gepost op: 2008/12/13, 10:06:08 »
De tutorial werkt, maar het probleem is dat ik zelf een Makefile moet maken.
Ik bedoel, als ik zelf van de grond af wil programmeren moet ik een Makefile maken. Bij de tutorial-voorbeelden is alles kant en klaar, en werd alles gecompileerd, toen ik de designer, etc. ook aan het compileren was.

Hans Kamp

  • Gast
Re: GUI programmeren
« Reactie #6 Gepost op: 2008/12/13, 10:54:24 »
Ik heb

qtcreator-0.9-linux-x86-setup.bin

gedownload. En dan?

Ik heb het gevonden:
chmod 755 qtcreator-0.9-linux-x86-setup.bin
./qtcreator-0.9-linux-x86-setup.bin

Dan wordt de installatie gestart.

Ik heb intussen een frame gemaakt met het volgende:
- label met de tekst: Getal1;
- invoerveld (naam = getal1);
- label met de tekst: Getal2;
- invoerveld (naam = getal2);
- label met de tekst: Som;
- label met de tekst: 0 (heb ik som genoemd);
- knop met de naam: Bereken.
De bedoeling is dat ik op de knop Bereken klik. getal1 en getal2 worden bij elkaar opgeteld, en de resultaat komt in de label met de naam som. Zodra ik weer op Bereken klik, moeten de getallen weer bij elkaar worden opgeteld.

Maar het programmeren met events gaat anders dan met C++Builder. Je zou dubbelklikken op een knop (in de Form Designer) en dan kun je een optel-event programmeren. Maar hoe gaat dat dan met QtCreator? Iets met signalen of zo? Signal zal wel clicked() zijn (ik wil een event als ik met de muis op een knop klik), maar wat dan? De tutorials helpen me niet verder, of ik vind geen tutorial waar dat is uitgelegd, specifiek voor QtCreator.
« Laatst bewerkt op: 2008/12/13, 11:45:53 door Hans Kamp »

Offline lordnoid

  • Lid
Re: GUI programmeren
« Reactie #7 Gepost op: 2008/12/13, 14:37:15 »
Ik ben niet zo'n genie in C++ maar ik hoop dat ik je hiermee kan helpen:
Ja klopt voor elke actie moet je een connectie instellen. Die verbindt je user interface aan je code.
QObject::connect( ui.Bereken, SIGNAL(clicked()), this, SLOT(optellen()) );in je mainwindow.cpp in de MainWindow::MainWindow functie, daarzo onder ui.setupUi(this);
Nu is je Bereken knop verbonden aan de functie optellen() in de class MainWindow. Het klikken op bereken is nu het signaal (signal) en het optellen() is het slot.

Dan maken we die functie. De functie is een slot, dus die moeten we ook als slot neerzetten in mainwindow.h
Voeg bijvoorbeeld dit toe aan de class.
public slots:
  void optellen();

dan naar main.cpp en de functie maken

void MainWindow::optellen()
{
  int uitkomst = ui.getal1->text().toInt()+ui.getal2->text().toInt();
  ui.som->setNum(uitkomst);
}
Eigenlijk is dit niet zo netjes.. Meestal wordt de code in een andere class geplaatst dan de user interface (MainWindow)
« Laatst bewerkt op: 2008/12/13, 14:59:38 door lordnoid »

Hans Kamp

  • Gast
Re: GUI programmeren
« Reactie #8 Gepost op: 2008/12/13, 14:41:21 »
Bedankt. Het werkt nu. Aangezien het een beta-versie is, hoop ik dat in latere beta-versies en in de uiteindelijke versie, de bovenstaande uitleg geautomatiseerd wordt, zodra je in de designer op de button dubbelklikt. Ik kom nu tot de volgende bestanden:

main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

void MainWindow::optellen()
{
        int uitkomst = ui.getal1->text().toInt() + ui.getal2->text().toInt();
        ui.som->setNum(uitkomst);
}

mainwindow.cpp
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
   QObject::connect(ui.berekenButton, SIGNAL(clicked()), this, SLOT(optellen()));
}

MainWindow::~MainWindow()
{

}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include "ui_mainwindow.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MainWindow();

private:
    Ui::MainWindowClass ui;

public slots:
    void optellen();
};

#endif // MAINWINDOW_H

« Laatst bewerkt op: 2008/12/13, 15:23:16 door Hans Kamp »

Hans Kamp

  • Gast
Re: GUI programmeren
« Reactie #9 Gepost op: 2008/12/13, 21:50:00 »
Okay, nu weer een ander uitprobeersel. Ik probeer Kladblok of Notepad van Windows na te apen. Dat lijkt eenvoudig, maar het is ook een goede programmeeroefening. Ik heb de volgende bestanden:

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include "ui_mainwindow.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MainWindow();

private:
    Ui::MainWindowClass ui;

public slots:
    void nieuw();
    void open();
    void opslaan();
    void opslaanAls();
    void verlaat();
};

#endif // MAINWINDOW_H

main.cpp
#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

void MainWindow::nieuw()
{
    ui.contents->setText("Nieuw");
}

void MainWindow::open()
{
    ui.contents->setText("Open");
}
void MainWindow::opslaan()
{
    ui.contents->setText("Opslaan");
}
void MainWindow::opslaanAls()
{
    ui.contents->setText("Opslaan als");
}
void MainWindow::verlaat()
{
    this->close();
}

mainwindow.cpp
#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
    QObject::connect(ui.action_New, SIGNAL(trigger()), this, SLOT(nieuw()));
    QObject::connect(ui.action_Open, SIGNAL(trigger()), this, SLOT(open()));
    QObject::connect(ui.action_Save, SIGNAL(trigger()), this, SLOT(opslaan()));
    QObject::connect(ui.actionSave_as, SIGNAL(trigger()), this, SLOT(opslaanAls()));
    QObject::connect(ui.actionE_xit, SIGNAL(trigger()), this, SLOT(verlaat()));
}

MainWindow::~MainWindow()
{

}

- De menu items veroorzaken geen events;
- Hoe verander ik de tekst van het textveld (ui.contents)?

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: GUI programmeren
« Reactie #10 Gepost op: 2008/12/13, 22:08:26 »
Lees dit eens door :)
http://doc.trolltech.com/4.4/mainwindows-application.html
let wel op dat in dat voorbeeld de GUI handmatig geprogrammeerd werd, zonder Designer..

Bij jou werken de signals niet omdat het signal "triggered()" moet zijn ipv "trigger()"
zie ook: http://doc.trolltech.com/4.4/qaction.html#triggered
Verder is de QObject:: prefix niet nodig bij connect, omdat de class zelf een QObject is, maar langs de andere kant kan het ook geen kwaad

setText() zou moeten werken, zoals in je voorbeeld.. voor meer info zie
http://doc.trolltech.com/4.4/qtextedit.html#setText
http://doc.trolltech.com/4.4/qtextedit.html#setHtml
http://doc.trolltech.com/4.4/qtextedit.html#setPlainText
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Hans Kamp

  • Gast
Re: GUI programmeren
« Reactie #11 Gepost op: 2008/12/13, 22:15:21 »
Bij jou werken de signals niet omdat het signal "triggered()" moet zijn ipv "trigger()"
zie ook: http://doc.trolltech.com/4.4/qaction.html#triggered
Verder is de QObject:: prefix niet nodig bij connect, omdat de class zelf een QObject is, maar langs de andere kant kan het ook geen kwaad
Bedankt. Nu werkt het wel.

Citaat
setText() zou moeten werken, zoals in je voorbeeld.. voor meer info zie
http://doc.trolltech.com/4.4/qtextedit.html#setText
http://doc.trolltech.com/4.4/qtextedit.html#setHtml
http://doc.trolltech.com/4.4/qtextedit.html#setPlainText
Ik kreeg eerst wat foutmeldingen, maar nu werkt setText() ook.

Offline postbus24

  • Lid
Re: GUI programmeren
« Reactie #12 Gepost op: 2008/12/15, 14:46:29 »
Of je kan ook voor glade gaan. Dat is de interface die gnome gebruikt.
Of is nu glade het pakket on in GTK te ontwikkelen  ???

annyway, alvast hier de bijbel/referentie voor GTK:
http://library.gnome.org/devel/gtk/stable/gtkobjects.html

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: GUI programmeren
« Reactie #13 Gepost op: 2008/12/15, 16:47:48 »
Glade is een GUI designer voor GTK+, maar eentje met een eigen willetje :-X
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)