Nieuws:

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

Auteur Topic: Qt connect  (gelezen 1994 keer)

Offline oo7

  • Lid
Qt connect
« Gepost op: 2009/01/01, 17:48:31 »
Ik ben net over gestapt van GTK+ / GTKmm naar Qt4, maar dat bevalt nog niet helemaal.
Al die SIGNALS en SLOTS werken echt verschrikkelijk!
klein voorbeeldje:
QObject::connect(&knopje, SIGNAL(clicked()), &label, SLOT(setText("Hoi")));
Compilen lukt wel, maar als ik het run:
Object::connect: No such slot QLabel::setText("Hoi")
http://www.000webhost.com/74168.html Beste gratis webhosting die er is!!!
Wie zich via deze link aanmeld helpt een arme student (ik dus)

Re: Qt connect
« Reactie #1 Gepost op: 2009/01/01, 19:30:29 »
Da's vreemd. Je gebruikt toch zeker wel qmake? Gewoon met gcc gaat het niet lukken....

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Qt connect
« Reactie #2 Gepost op: 2009/01/01, 23:37:47 »
Het probleem is dat het signaal geen parameter heeft, maar het slot wel een parameter vereist... In dit specifieke geval zou je bijvoorbeeld een functie kunnen implementeren om de tekst op "Hoi" te krijgen... Het signal/slot-mechanisme is alleen maar doeltreffend wanneer het op een efficiƫnte manier wordt gebruikt. Aangezien setText("Hoi") eigenlijk toch steeds dezelfde constante aanroep doet kan je net zo goed een (slot) functie setTextToHoi schrijven die rechtstreeks label.setText("Hoi") uitvoert.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline dvdmeer

  • Lid
    • Python-RandR :: dvdmeer.nl
Re: Qt connect
« Reactie #3 Gepost op: 2009/01/02, 10:49:18 »
Zou je dat niet met lambda kunnen oplossen?


Offline oo7

  • Lid
Re: Qt connect
« Reactie #4 Gepost op: 2009/01/02, 11:52:06 »
Het probleem is dat het signaal geen parameter heeft, maar het slot wel een parameter vereist... In dit specifieke geval zou je bijvoorbeeld een functie kunnen implementeren om de tekst op "Hoi" te krijgen... Het signal/slot-mechanisme is alleen maar doeltreffend wanneer het op een efficiƫnte manier wordt gebruikt. Aangezien setText("Hoi") eigenlijk toch steeds dezelfde constante aanroep doet kan je net zo goed een (slot) functie setTextToHoi schrijven die rechtstreeks label.setText("Hoi") uitvoert.
Ik heb een zwakke poging gedaan, maar het werkt nog steeds niet:

#include <QFileDialog>
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QTableWidget>
#include <QStringList>

class scherm : public QWidget
{
public:
scherm(QApplication*);
protected:
QHBoxLayout *ind;
QVBoxLayout *menu;
QLabel *saveloc;
QPushButton *selectbut;
QTableWidget *tabel;
QStringList *kolommen;
public slots:
void savelocsetgedaan(){
saveloc->setText("Gedaan!");
}
};
scherm::scherm(QApplication *app) : QWidget()
{
setFixedSize(500,600);
ind = new QHBoxLayout();
tabel = new QTableWidget(0,2);
kolommen = new QStringList;
*kolommen << "Status" << "Echte naam";
tabel->setHorizontalHeaderLabels(*kolommen);

menu = new QVBoxLayout();
saveloc = new QLabel("Opslaan in map:");
selectbut = new QPushButton("...");
menu->addWidget(saveloc);
menu->addWidget(selectbut);
QObject::connect(selectbut, SIGNAL(clicked()), this, SLOT(savelocsetgedaan()));


ind->addWidget(tabel);
ind->addLayout(menu);

setLayout(ind);
}




int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
scherm window(&app);
    window.show();
    return app.exec();
}
http://www.000webhost.com/74168.html Beste gratis webhosting die er is!!!
Wie zich via deze link aanmeld helpt een arme student (ik dus)

Offline profoX

  • Lid
    • wesley
    • Lionslink
Re: Qt connect
« Reactie #5 Gepost op: 2009/01/02, 17:53:46 »
In Qt moet je alles netjes opdelen in header .h en source .cpp files als je wil dat alles netjes werkt, dat komt o.a. doordat Qt nog een meta-object-compiler (moc) heeft die aan preprocessing doet..

Voorbeeld:

test.h
#include <QWidget>

// forward decl
class QHBoxLayout;
class QVBoxLayout;
class QLabel;
class QPushButton;
class QTableWidget;
class QStringList;

class scherm : public QWidget
{
        Q_OBJECT
public:
        scherm();
protected:
        QHBoxLayout *ind;
        QVBoxLayout *menu;
        QLabel *saveloc;
        QPushButton *selectbut;
        QTableWidget *tabel;
        QStringList *kolommen;
public slots:
        void savelocsetgedaan();
};

test.cpp
#include <QFileDialog>
#include <QApplication>
#include <QPushButton>
#include <QLabel>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QTableWidget>
#include <QStringList>
#include "test.h"

scherm::scherm() : QWidget()
{
        setFixedSize(500,600);
        ind = new QHBoxLayout();
        tabel = new QTableWidget(0,2);
        kolommen = new QStringList;
        *kolommen << "Status" << "Echte naam";
        tabel->setHorizontalHeaderLabels(*kolommen);

        menu = new QVBoxLayout();
        saveloc = new QLabel("Opslaan in map:");
        selectbut = new QPushButton("...");
        menu->addWidget(saveloc);
        menu->addWidget(selectbut);
        QObject::connect(selectbut, SIGNAL(clicked()), this, SLOT(savelocsetgedaan()));

        ind->addWidget(tabel);
        ind->addLayout(menu);

        setLayout(ind);
}

void scherm::savelocsetgedaan() {
        saveloc->setText("Gedaan!");
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    scherm window;
    window.show();
    return app.exec();
}

(in principe zou main best ook in een apart bestand kunnen staan, om het geheel netter te maken, maar dat is niet verplicht)
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline oo7

  • Lid
Re: Qt connect
« Reactie #6 Gepost op: 2009/01/03, 11:03:43 »
Wat een gezanik!!
Maar vooruit, het werkt.
Hartelijk bedankt!
http://www.000webhost.com/74168.html Beste gratis webhosting die er is!!!
Wie zich via deze link aanmeld helpt een arme student (ik dus)