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

QT - komunikacja zdarzenia

Object Storage Arubacloud
0 głosów
121 wizyt
pytanie zadane 12 kwietnia 2019 w C i C++ przez niezalogowany
edycja 12 kwietnia 2019

mam 2 klasy

//nr 1
void Widget::on_pushButton_clicked(){
int zmienalokalna;
QString zmienalokalna_ale_string;

// niby działa ale jest jakiś błąd z konwersją.
 ui->lineEdit->textChanged(zmienalokalna_ale_string);
    zmienalokalna=zmienalokalna_ale_string.toInt();
}
//nr 2
void Widget::on_lineEdit_textChanged(const QString &arg1){
int ta_sama_zmienna_lokalna;
//bo zmiennalokalna jej nie widzi co jest logiczne;
}

Ale mi chodzi czy jest jakaś funkcja by wysłać on_lineEdit_textChanged ->on_pushButton_clicked()

Sygnał i slot to działa przy zmianie tekstu można przycisnąć przycisk czy jakoś tak ale ja nie chce guzika przyciskać.

gdzieś widziałem dodatkowa klasę do komunikacji miedzy zdarzeniami nie próbowałem jeszcze, ale wydawało się rozsądne. Ale jest może jakiś prosty sposób na jedną dwie linijki, a nie od razu na całą klasę.

A nie mogę całego kodu napisać dla przycisku bo to nie będzie ui tylko konsola;

a i zmienne globalne tęż odpadają bo to żadne rozwiązanie.

I jak by ktoś mógł powiedzieć jak poustawiać domyślne rozmiary przycisków żeby się nie zmiały jak wezmę layout np poziomy czy przymocuję do okna. Najlepiej jak by było kawałek kodu zamiast szukać w tabelce.

1 odpowiedź

0 głosów
odpowiedź 12 kwietnia 2019 przez Bondrusiek Maniak (61,410 p.)
wybrane 12 kwietnia 2019
 
Najlepsza

Witam,

tak na początku:

mam 2 klasy

Klasę masz jedną Widget natomiast posiadasz dwie funkcję składowe  on_pushButton_clicked() oraz void on_lineEdit_textChanged(const QString &arg1), które zapewne są slotami. Drugą rzeczą jest nazwa QT. Jest to nieprawidłowa nazwa frameworka. Poprawną nazwą to Qt. Można popatrzyć : https://www.qt.io/.

Co do pytania to zamiast zmiennej globalnej możesz użyć zmiennej składowej. Taka zmienna jest widoczna w całym zakresie klasy. Możesz użyć zakresów private, protected oraz public. W tym przypadku najrosądniejsze jest wybranie private.

np.

class Widget
{
...
private:
int m_myInt;
...
};

void Widget::on_pushButton_clicked()
{
int zmienalokalna;
const QString zmienalokalna_ale_string;
 
// niby działa ale jest jakiś błąd z konwersją. // dodaj const do tego QString
 ui->lineEdit->textChanged(zmienalokalna_ale_string);
    zmienalokalna=zmienalokalna_ale_string.toInt();
m_myInt = zmiennalokalna;
}
void Widget::on_lineEdit_textChanged(const QString &arg1){
int ta_sama_zmienna_lokalna;
//bo zmiennalokalna jej nie widzi co jest logiczne;
//m_myInt ---> ta zmienna pamięta to co pobrała z on_pushButton_clicked() 
//wazna jest kolejność bo może być wartość śmieciowa
}

Drugą rzeczą jest użycie sygnałów i slotów

class Widget
{
...
signals:
void signalSender(int);
private slots:
void slotReceiver(int);
...
}

void Widget::on_pushButton_clicked(){
int zmienalokalna;
QString zmienalokalna_ale_string;
 
// niby działa ale jest jakiś błąd z konwersją.
 ui->lineEdit->textChanged(zmienalokalna_ale_string);
    zmienalokalna=zmienalokalna_ale_string.toInt();

emit signalSender(zmienalokalna);
}

teraz jeśli chcesz w slocie możesz otrzymać ta zmienną

void Widget::slotReceiver(int fromSender)
{
//fromSender w tym przypadku to wartość zmiennalokalna
}
//Jeszcze należy podłączyć sygnał i slot np w konstruktorze
Widget::Widget(QWidget *parent) : QWidget(parent)
{
...
connect(this, &Widget::signalSender, this, &Widget::slotReceiver);
...
}

 

komentarz 12 kwietnia 2019 przez niezalogowany
zaraz wypróbuje z ta klasą do dałem ciała (myślałem że jak ma konstruktory których tu nie widzę może ja jest bo ma jakieś tam kształty ale to tylko funkcja przyjaciel tak mainWindow , Widget)

a czy da się zrobić zamiast void signalSender(int), to  void signalSender(auto*)?

albo jakoś z operatorem new, to by kompilator mógł sobie natworzyć tyle slotów ile bym potrzebował  ?

A i tak się zastanawiam on_lineEdit_textChanged(const QString &arg1)  poco jest ten &arg1
komentarz 12 kwietnia 2019 przez Bondrusiek Maniak (61,410 p.)

a czy da się zrobić zamiast void signalSender(int), to  void signalSender(auto*)?

Z tego co się orientuje to nie możesz wykorzystać operatora auto bez podania wartości inicjalizującej.  http://cpp0x.pl/dokumentacja/standard-C++11/auto/731

jakoś z operatorem new, to by kompilator mógł sobie natworzyć tyle slotów ile bym potrzebował  

Nie rozumiem tego pytania. Więcej info odnośnie slotów w Qt: https://doc.qt.io/qt-5/signalsandslots.html

komentarz 12 kwietnia 2019 przez niezalogowany
edycja 12 kwietnia 2019

@Bondrusiek,

w sumie to nie kumam, bo ta linijka poniżej zrobiła wszystko bez dodatkowych zmiennych i funkcji w widget.h  void signalSender(int);  void slotReceiver(int); int m_myInt; tylko musze przycisnąć przycisk by zadziałało, a ja nie chcę naciskać przycisku bo lineEdit ma taki sygnał wbudowany i nie trzeba nic kombinować, tylko przy zmianie tekstu by mi wszystko automatycznie pozmieniał.

void Widget::on_pushButton_clicked(){
ui -> lineEdit ->text().setNum(zmienna);} //<-ta linijka


 

Podobne pytania

0 głosów
1 odpowiedź 343 wizyt
pytanie zadane 1 listopada 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 176 wizyt
pytanie zadane 20 września 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 613 wizyt
pytanie zadane 16 listopada 2020 w C i C++ przez Lyokoheros Początkujący (340 p.)

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!

...