Przekazywanie parametrów do funkcji [QT]

Odpowiedz Nowy wątek
Z
2012-12-16 12:38
Z
0

Problem wygląda następująco, chciałbym aby podczas kliknięcia danego przycisku została wywoływana funkcja i zostały przekazane do niej parametry. Kod wygląda następująco:

mainwindow.hpp:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QApplication>
#include <QPushButton>
#include <QLabel>

class MainWindow : public QMainWindow
{
   Q_OBJECT

private:
   QPushButton *przycisk1;
   QLabel * etykieta1;
   QPushButton * przycisk2;

public:
   MainWindow();

public slots:
   int foo(int a);

};

#endif // MAINWINDOW_H

main.cpp:

#include "mainwindow.hpp"

int main (int argc, char *argv[])
{

   QApplication app(argc, argv);
   MainWindow window;

   window.show();

   return app.exec();

}

mainwindow.cpp:

#include "mainwindow.hpp"

MainWindow::MainWindow()
{
    etykieta1 = new QLabel(tr("Czerwony"), this);
    etykieta1->setGeometry(5, 5, 150, 30);

    przycisk1 = new QPushButton(tr("&Nacisnij"), this);
    przycisk1->setGeometry(5, 30, 100, 30);

    przycisk2 = new QPushButton(tr("&Nacisnij"), this);
    przycisk2->setGeometry(5, 160, 100, 30);

    connect(przycisk1, SIGNAL(clicked()), this, SLOT(foo(1)));
    connect(przycisk2, SIGNAL(clicked()), this, SLOT(foo(2)));

    setMinimumSize(300, 300);
    resize(480, 320);
}

int MainWindow :: foo(int a)
{

if(a==1)etykieta1->setText(tr("Zielony"));
if(a==2)etykieta1->setText(tr("Niebieski"));

}

Gdzie popełniam błąd? Dodam, że gdy do funkcji nie dodam żadnych parametrów program działa.

Pozostało 580 znaków

2012-12-16 13:06

Rejestracja: 8 lat temu

Ostatnio: 6 lat temu

0

Slot ma paramtery, nie posiada domyślnego parametru wieć jak nie podasz mu to program nie będzie działał.

Mozesz zrobić dwa osobne sloty - jeden zielony drugie niebieski ale wtedy będą bez parametrów.

Rozwiń przykład bo w tym nie przekazujesz parametrów, tylko je wstawiasz na sztywno. W tym przypadku raczej nie widzę innego rozwiązania.


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go.

Pozdrawiam

Pozostało 580 znaków

z
2012-12-16 13:42
z
0

"Slot ma paramtery, nie posiada domyślnego parametru wieć jak nie podasz mu to program nie będzie działał." Szczerze mówiąc nie rozumiem tego zdania... Według ciebie mam zrobić 2 oddzielne sloty, czyli jeden przycisk będzie odpowiadał za wywołanie jednej funkcji, a drugi za wywołanie drugiej funkcji tak?

Pozostało 580 znaków

z
2012-12-16 19:19
z
0

Jest ktoś w stanie mi to wytłumaczyć? Rozwiązało by to sporo moich problemów...

Pozostało 580 znaków

2012-12-16 19:36

Rejestracja: 7 lat temu

Ostatnio: 2 dni temu

0
z napisał(a):

Jest ktoś w stanie mi to wytłumaczyć? Rozwiązało by to sporo moich problemów...

Slot ma parametry czytaj -> slot(int, char, bla bla...)
Nie ma domyslnych parametrow czytaj -> slot(int = 0) <- nie istnieje!
Przy wywolaniu slota musisz mu podac ow parametry czytaj -> slot("babcia", 12, bla bla...).
// W twoim przykladzie ofc.

Jeszcze jedno bo nie czytalem calosci:
Mozesz zrobic 2 sloty np.
a()
b()
Nie przyjmujace zadnych parametrow, ale wywolywane tylko dla okreslonych zdarzen.

Np:
KolorujTlo(Kolor) {
Jezeli Kolor jest niebieski wywolaj slot Niebieski
Jezeli Kolor jest zielony wywolaj slot Zielony
}

Sloty:
Niebieski() {...}
Zielony() {...}

edytowany 3x, ostatnio: n0name_l, 2012-12-16 19:40

Pozostało 580 znaków

2012-12-16 20:34

Rejestracja: 12 lat temu

Ostatnio: 2 minuty temu

1

Najlepsze rozwiazanie to: QSignalMapper

QSignalMapper mapper = new QSignalMapper(etykieta1);
mapper->setMapping(przycisk1, tr("Zielony"));
mapper->setMapping(przycisk2, tr("Niebieski"));
connect(przycisk1, SIGNAL(clicked()), mapper, SLOT(map()));
connect(przycisk2, SIGNAL(clicked()), mapper, SLOT(map()));
connect(mapper, SIGNAL(mapped(QString)), etykieta1, SLOT(setText(String)));

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22, 2012-12-17 10:31

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0