Problem z obsługą slotu

0

Witam,

mimo wielu prób i poświęcenia sporej ilości czasu, nie mogę dojść czemu po naciśnięciu przycisku nie działa slot.

Main.cpp

 #include <QApplication>
#include <QPushButton>
#include <QTextCodec>
#include <QMainWindow>
#include <mojeokno.h>


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

    QApplication app(argc, argv);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1250"));

    MojeOkno okienko;
    okienko.show();

    return app.exec();

}

mojeokno.h

 #ifndef MOJEOKNO_H
#define MOJEOKNO_H

#include <QMainWindow>
#include <QPushButton>


class MojeOkno : public QMainWindow
{
    Q_OBJECT
public:
    MojeOkno();
    ~MojeOkno();
    QPushButton *aa;


private slots:
    void test(QPushButton *a);


};

#endif // MOJEOKNO_H

mojeokno.cpp

#include "mojeokno.h"
#include <QApplication>

MojeOkno::MojeOkno(): QMainWindow()
{

    setGeometry(400,300,300,200);
    setWindowTitle("Okno 1");
    aa = new QPushButton("Nie działa", this);
    aa->setGeometry(100,120,100,40);
    QObject::connect(aa,SIGNAL (clicked()),this, SLOT (test(aa)));

}

MojeOkno::~MojeOkno()
{

}

void MojeOkno::test(QPushButton *a)
{
    a->setText("Działa");
    this->setWindowTitle("dziala");

}

 

Będę bardzo wdzięczny za pomoc w znalezieniu błędu.

1
lordbobstein napisał(a):
QObject::connect(aa,SIGNAL (clicked()),this, SLOT (test(aa)));

Nie możesz połączyć w ten sposób sygnału ze slotem. Nie można podawać nazw zmiennych w SIGNAL() i SLOT(). Slotowi podczas wywołania przekazywane są argumenty pochodzące z sygnału, a clicked() nie ma żadnych. Żeby połączyć tak jak napisałeś musiałbyś mieć sygnał clicked(QPushButton *) albo podobny. Wtedy wyglądałoby to tak:

connect(aa, SIGNAL(clicked(QPushButton *)),
        this, SLOT(test(QPushButton *)));

Tylko, że dla QPushButton domyślnie takiego sygnału nie ma (o ile dobrze pamiętam).

Można to rozwiązać również poprzez pozbycie się argumentu funkcji test():

void MojeOkno::test() {
    aa->setText("Działa");
    this->setWindowTitle("dziala");
}

Łączysz to używając:

connect(aa, SIGNAL(clicked()),
        this, SLOT(test()));

Nie wczytywałem się bardziej w resztę posta, Qt przez jakiś czas nie używałem i nie mam aktualnie zainstalowanego, więc nie za bardzo mam jak sprawdzić. :)

0

Problem rozwiązany :) Niestety pierwszy sposób nie działa, ale usunięcie argumentu załatwiło problem. Nie wiem czemu o tym nie pomyślałem. Dziękuję bardzo.

0
lordbobstein napisał(a):

Niestety pierwszy sposób nie działa
zadziała gdy zrobisz emita tego sygnału z argumentem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.