Qt - QCheckBox czemu nie zwraca stateChanged ?

0

Może mi ktoś podpowie dlaczego obiekt QCheckBox nie zwraca po kliknięciu stateChanged ?

Mam taki kod

chBoxOther = new QCheckBox();
chBoxOther->setText(QString(tr("Inny")));

gdzieś niżej robię connecta bo chcę uzyskać status kliknięcia w tego CheckBoxa

QObject::connect(chBoxOther, &QCheckBox::stateChanged, this, &myWindowOptionOpenCSV::myStateCheckBox);

funkcja myStateCheckBox wygląda tak

void myWindowOptionOpenCSV::myStateCheckBox(int s)
{
    qDebug()<< s;
}

w dokumentacji jest sygnał stateChanged i myślę że w powyższym connect podpiąłem go prawidłowo ? Wiem, że powinien zwrócić status

Zero -> Qt::Unchecked 0 The item is unchecked.
Dwa -> Qt::Checked 2 The item is checked.

Czy ktoś powie/naprowadzi mnie co robię źle ?

0

Nie zwraca czego?

W pokazanym kodzie zmieniasz stan przed podpięciem sygnału do slotu, więc nic dziwnego, że nie wywołujesz podpiętego slotu.

0

@kq:

W pokazanym kodzie zmieniasz stan przed podpięciem sygnału do slotu

no dobra ale ja już to kiedyś robiłem i zrobiłem to baaardzo naokoło... ale teraz chcę się nauczyć to robić prawidłowo.

Mam taką klasę w której jest ten QCheckBox i wygląda ona mniej więcej tak

myWindowOptionOpenCSV::myWindowOptionOpenCSV(QWidget *parent) : QWidget(parent)
{
// jakiś tam kod

    chBoxOther = new QCheckBox();
    chBoxOther->setText(QString(tr("Inny")));  

    QObject::connect(chBoxOther, &QCheckBox::toggled, lineEdOther, &QLineEdit::setEnabled);
    
    QObject::connect(chBoxOther, &QCheckBox::stateChanged, this, &myWindowOptionOpenCSV::myStateCheckBox);

// jakiś tam kod
}

void myWindowOptionOpenCSV::myStateCheckBox(int s)
{
    qDebug()<< s;
}

zauważ, że w tej klasie mam inny connect

QObject::connect(chBoxOther, &QCheckBox::toggled, lineEdOther, &QLineEdit::setEnabled);

do innego obiektu typu QLineEdit i o dziwo ten connect działa, więc nie wiem gdzie mam umieścić stateChanged, żeby zadziałał ?

1

Wygląda ok.
Wyczyść/przebuduj projekt.

PS. Nie podając parent w konstruktorze utrudniasz sobie niepotrzebnie życie

0

@tajny_agent:

Nie podając parent w konstruktorze utrudniasz sobie niepotrzebnie życie

masz na myśli że powinno to być tak ?

chBoxOther = new QCheckBox(this);

Wyczyść/przebuduj projekt.

zrobiłem i nic nie daje... jakiś czas temu miałem podobny projekt, to zrobiłem to z d.... strony ale zadziałało ale zrobiłem tak, ze zrobiłem klasę która dziedziczy po QCheckBox zrobiłem slot i podpiąłem ten sygnał i o dziwo zadziałało ale teraz nie chcę robić takich kombinacji bo nie ma to sensu... niby wygląda ok ale nie wiem co nadal mam źle...

0
zkubinski napisał(a):

masz na myśli że powinno to być tak ?

chBoxOther = new QCheckBox(this);

Dokładnie. Nie musisz wtedy pamiętać o delete w destruktorze, bo rodzic zrobi to automatycznie jak tylko sam zginie.

Wyczyść/przebuduj projekt.

zrobiłem i nic nie daje... jakiś czas temu miałem podobny projekt, to zrobiłem to z d.... strony ale zadziałało ale zrobiłem tak, ze zrobiłem klasę która dziedziczy po QCheckBox zrobiłem slot i podpiąłem ten sygnał i o dziwo zadziałało ale teraz nie chcę robić takich kombinacji bo nie ma to sensu... niby wygląda ok ale nie wiem co nadal mam źle...

Możesz jeszcze spróbować ręcznie usunąć folder z projektem.
Albo stwórz nowy czysty projekt i przetestuj:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    auto widget = new QWidget(this);
    auto chkBox = new QCheckBox(QString::fromUtf8("Aktywuj"), widget);
    auto inputEdit = new QLineEdit(widget);
    inputEdit->setEnabled(false);

    connect(chkBox, &QCheckBox::toggled, inputEdit, &QLineEdit::setEnabled);
    connect(chkBox, &QCheckBox::stateChanged, [](int state){ qDebug() << state; });

    auto lay = new QVBoxLayout;
    lay->addWidget(chkBox);
    lay->addWidget(inputEdit);
    lay->addStretch(1);
    widget->setLayout(lay);
    setCentralWidget(widget);
}
0

wątek chyba do zamknięcia, bo qDebug coś się s#@$%#ił... w konsoli działa jak należy, natomiast nic mi nie wyświetla w oknie "komunikaty aplikacji"

jakby ktoś miał podobny problem to rozwiązanie jest tutaj na screenach

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.