• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Qt sygnały i sloty

Object Storage Arubacloud
0 głosów
500 wizyt
pytanie zadane 11 czerwca 2020 w C i C++ przez Nabuchadonozor Gaduła (3,120 p.)
Dzień dobry wszystkim bywalcom,

zastanawia mnie, jak można sygnały zrobić samemu od zera w framework'u Qt. Czy jest może osoba, która by pomogła rozwiązać ten problem, który mnie tak zastanawia, a którego nigdzie nie ma. Jestem osobą, która jak się uczy, zastanawia się nad wszystkim, a więc i pisząc w Qt, nie bawię się w design'era, tylko pisze w "pusty projekt qmake". Czy jest jakaś osoba, która chciała by się lekko zabawić w nauczyciela, i napisała by, co trzeba zrobić, by pushButton po kliknięciu zrobił cokolwiek. A dokładniej co wpisać do pliku *.pro, main.cpp lub cokolwiek tam potrzebne jest. Byłbym bardzo wdzięczny, bo dosłownie nigdzie nie można tego znaleźć w necie, wszyscy jak już coś piszą, to przy całym projekcie, a nie wiadomo gdzie dokładnie trzeba co wpisać, by sygnały zadziałały.

Z góry bardzo dziękuję.

1 odpowiedź

+1 głos
odpowiedź 11 czerwca 2020 przez adrian17 Ekspert (346,320 p.)
wybrane 12 czerwca 2020 przez Nabuchadonozor
 
Najlepsza

Byłbym bardzo wdzięczny, bo dosłownie nigdzie nie można tego znaleźć w necie

Wydaje mi się, że wszystko jest ładnie w dokumentacji Qt?

https://doc.qt.io/qt-5/signalsandslots.html

https://doc.qt.io/qt-5/qpushbutton.html

A push button emits the signal clicked() when it is activated by the mouse, the Spacebar or by a keyboard shortcut. Connect to this signal to perform the button's action

Czyli na przykład (na ślepo), coś takiego?

connect(jakis_button, &QPushButton::clicked, this, &MojaKlasa::mojaMetoda);

 

komentarz 12 czerwca 2020 przez Nabuchadonozor Gaduła (3,120 p.)

Tak tak właśnie o to, myślałem że tego więcej jest, przez co mi kod nie działa, a tu jednak klops. Wiesz może, jak zareagować na błąd:

#include "menulogin.h"

menuLogin::menuLogin()
{
    QWidget *window = new QWidget;
    QGridLayout *glout = new QGridLayout;
    QPushButton *btn = new QPushButton("LOGOWANIE");
    QPushButton *btn2 = new QPushButton("TWORZENIE KONTA");
    QPushButton *btn3 = new QPushButton("ZAPOMNIAŁEŚ DANYCH KONTA? POMOŻEMY CI JE ODZYSKAC");

    glout->addWidget(btn, 0, 0);
    glout->addWidget(btn2, 0, 1);
    glout->addWidget(btn3, 1, 0, 1, 2);

    window->setLayout(glout);
    window->setMinimumSize(350,350);
    window->setWindowTitle("menuLogin");
    window->show();

    connect(btn, &QPushButton::clicked, this, &menuLogin::btnLogin);
    tu pisze "no matching function for call to 'connect'

}

void menuLogin::btnLogin(){
    QLabel *lbl = new QLabel("XD");
}

 

komentarz 12 czerwca 2020 przez adrian17 Ekspert (346,320 p.)
Hmm... a pełny komunikat?

Rozumiem, że to Qt 5?
komentarz 12 czerwca 2020 przez Nabuchadonozor Gaduła (3,120 p.)
Właśnie to pełny komunikat, gdy linijkę niżej spacją spamowałem, by dostać się do reszty komunikatu, to cały czas tylko do 'connect' był napis, więc raczej to cały.

Qt Creator v4.12

Qt 5.14.2 (MinGW 7.3.0 64 bit)

Robiąc sprawdzanie aktualizacji na Qt pisze, że to jest najnowsza.

Kurde nie wiem co robić... Jak dopisałem QObject::connect(...) to ten komunikat znikł, jednakże błąd przy kompilacji występuje związany z tą linijką...
komentarz 12 czerwca 2020 przez adrian17 Ekspert (346,320 p.)

To na pewno nie jest cały komunikat; w zakładce z konsolą powinno być więcej.

to ten komunikat znikł, jednakże błąd przy kompilacji występuje związany z tą linijką...

jaki?

I dla pewności... pokażesz plik .h?

komentarz 12 czerwca 2020 przez Nabuchadonozor Gaduła (3,120 p.)

tam jest tego tyle tych komunikatów, że aż głowa boli.. 

menulogin.h:

#ifndef MENULOGIN_H
#define MENULOGIN_H

#include <QtWidgets>
#include <QGridLayout>

class menuLogin
{
public:
    menuLogin();
    void btnLogin();
};

#endif // MENULOGIN_H

dodam jeszcze, że np. taka kombinacja:

#include "menulogin.h"

menuLogin::menuLogin()
{
    QWidget *window = new QWidget;
    QGridLayout *glout = new QGridLayout;
    QPushButton *btn = new QPushButton("LOGOWANIE");
    QPushButton *btn2 = new QPushButton("TWORZENIE KONTA");
    QPushButton *btn3 = new QPushButton("ZAPOMNIAŁEŚ DANYCH KONTA? POMOŻEMY CI JE ODZYSKAC");
    QLabel *label = new QLabel("XD");                     /// inne
    QLineEdit *lineEdit = new QLineEdit;                 /// inne

    glout->addWidget(btn, 0, 0);
    glout->addWidget(btn2, 0, 1);
    glout->addWidget(btn3, 1, 0, 1, 2);
    glout->addWidget(label, 2, 0);                /// inne
    glout->addWidget(lineEdit, 2, 1);            /// inne

    window->setLayout(glout);
    window->setMinimumSize(350,350);
    window->setWindowTitle("menuLogin");
    window->show();


    QObject::connect(lineEdit, &QLineEdit::textChanged, /// inne
                     label,  &QLabel::setText);                           /// inne

}

działa poprawnie, choć to wcale mi się nie przydaje, sprawdzałem czy wgl connect jakikolwiek zadziała...

komentarz 12 czerwca 2020 przez adrian17 Ekspert (346,320 p.)

Ah. To na oko jeszcze Ci brakuje QObject oraz deklaracji slotu. Rzuć okiem tutaj:

https://doc.qt.io/qt-5/signalsandslots.html

komentarz 12 czerwca 2020 przez Nabuchadonozor Gaduła (3,120 p.)

Dodałem pare linijek do pliku nagłówkowego i bardzo wiele błędów zniknęło, jednakże pozostały 2:

- undefined reference to 'vtable for menuLogin'

- collect2.exe: error: ld returned 1 exit status 

#ifndef MENULOGIN_H
#define MENULOGIN_H

#include <QtWidgets>
#include <QGridLayout>
#include <QObject>

class menuLogin : public QObject
{
    Q_OBJECT
public:
    menuLogin();
    void btnLogin();
};

#endif // MENULOGIN_H

czuję, że dzięki Tobie jestem na dobrej drodze do sukcesu :)

komentarz 12 czerwca 2020 przez adrian17 Ekspert (346,320 p.)
Hm... ale teraz już nie wiem, sorry. Musisz poguglować.
komentarz 12 czerwca 2020 przez Nabuchadonozor Gaduła (3,120 p.)
szkoda... ale i tak @adrian17 wielkie dzięki!

Podobne pytania

+1 głos
1 odpowiedź 625 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez MiO Obywatel (1,310 p.)
+2 głosów
0 odpowiedzi 353 wizyt
0 głosów
1 odpowiedź 387 wizyt

92,676 zapytań

141,581 odpowiedzi

320,060 komentarzy

62,039 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...