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

Qt sygnały i sloty

Cloud VPS
0 głosów
736 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 Mentor (354,120 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 Mentor (354,120 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 Mentor (354,120 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 Mentor (354,120 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 Mentor (354,120 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ź 780 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez MiO Obywatel (1,310 p.)
+2 głosów
0 odpowiedzi 563 wizyt
0 głosów
1 odpowiedź 574 wizyt

93,459 zapytań

142,453 odpowiedzi

322,722 komentarzy

62,837 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

Kursy INF.02 i INF.03
...