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

Nie mogę edytować napisu na przycisku Qt C++

Mały hosting, OGROMNE możliwości
0 głosów
596 wizyt
pytanie zadane 1 listopada 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)

Witam, piszę program, który ma być prostym serwerem TCP. Kiedy klikamy na przycisk start serwer ma się uruchomić a napis na przycisku ma zmienić się na stop. Napisałem kod taki jak poniżej i podczas debugowania wyskakuje mi taki błąd:

The inferior stopped because it triggered an exception.
Stopped in thread 0 by: Exception at 0x7ffdfaeb157b, code: 0xc0000005: read access violation at: 0xffffffffffffffff, flags=0x0 (first chance).

Kiedy do funkcję:

QObject::connect(serverFlowBtn, &QPushButton::clicked, this, [this]{this->serverFlowBtnClicked();});

Zamienię na:

QObject::connect(serverFlowBtn, &QPushButton::clicked, this, [serverFlowBtn]{serverFlowBtn->setText("Stop");});

Wszystko działa ale ja chciałbym możliwość przekazania do funkcji lambda całego obiektu abym mógł wykonywać na nim metody, w których jest od razu cała logika programu. Co dokładnie oznacza ten błąd? Znalazłem kilka postów na forach i wiem, że chodzi o coś z pointerami, lecz nie wiem jak odnieść to do mojego kodu.

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QTextEdit>
#include <QMessageBox>

class MainWindow : public QWidget
{
public:
    MainWindow();

private:
    QVBoxLayout* mainLayout;
    QTextEdit* logInfo;
    QPushButton* clearLogsBtn;
    QPushButton* serverFlowBtn;

    bool serverRunning;

    void serverFlowBtnClicked();
};

#endif // MAINWINDOW_H

MainWindow.cpp

#include "mainwindow.h"

MainWindow::MainWindow()
{
    this->resize(800, 600);
    serverRunning = false;
    mainLayout = new QVBoxLayout(this);
    mainLayout->setSpacing(10);
    mainLayout->setAlignment(Qt::AlignTop);

    QTextEdit* logInfo = new QTextEdit(this);
    logInfo->setReadOnly(true);
    mainLayout->addWidget(logInfo);

    QPushButton* serverFlowBtn = new QPushButton("Start", this);
    serverFlowBtn->setMinimumHeight(40);
    mainLayout->addWidget(serverFlowBtn);

    QPushButton* clearLogsBtn = new QPushButton("Clear", this);
    clearLogsBtn->setMinimumHeight(40);
    mainLayout->addWidget(clearLogsBtn);

    QObject::connect(serverFlowBtn, &QPushButton::clicked, this, [this]{this->serverFlowBtnClicked();});

    this->show();
}

void MainWindow::serverFlowBtnClicked()
{
    this->serverFlowBtn->setText("Stop");
}

 

1 odpowiedź

0 głosów
odpowiedź 1 listopada 2021 przez adrian17 Mentor (354,880 p.)
Na oko, nie widzę żebyś gdziekolwiek ustawiał wskaźnik `this->serverFlowBtn`, więc próba go użycia z pewnością się nie uda.
komentarz 1 listopada 2021 przez tonn204 Mądrala (7,470 p.)
Czyli, żeby go ustawić powinienem stworzyć oddzielną zmienną?
komentarz 1 listopada 2021 przez adrian17 Mentor (354,880 p.)
Nie, już masz pole klasy, tylko go nie przepisujesz. Wręcz bym powiedział, że niepotrzebnie deklarujesz te zmienne w konstruktorze.

(a na boku zapytam... nie używasz Qt Creatora? Bo normalnie ten cały kod z konstruktora byłby poprawnie auto-generowany.)
komentarz 2 listopada 2021 przez tonn204 Mądrala (7,470 p.)
edycja 2 listopada 2021 przez tonn204
Używam Qt Creatora ale zrobiłem zawsze jak tworzę klasę to wszystko pisze sam od początku. A co do zmiennych to są one teraz atrybutami klasy MainWindow. Czyli powinienem stworzyć je w konstruktorze bez ustawiania ich jako atrybutów klasy?
komentarz 2 listopada 2021 przez adrian17 Mentor (354,880 p.)

Używam Qt Creatora ale zrobiłem zawsze jak tworzę klasę to wszystko pisze sam od początku.

A... czemu nie w designerze? Miałbyś te guziki i ich eventy przypisane poprawnie i automatycznie.

Czyli powinienem stworzyć je w konstruktorze bez ustawiania ich jako atrybutów klasy?

Trzeci raz mówię że na odwrót - obecnie nie ustawiasz pól klasy w konstruktorze, a powinieneś to zrobić.

Podobne pytania

0 głosów
0 odpowiedzi 555 wizyt
pytanie zadane 14 października 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
+1 głos
2 odpowiedzi 658 wizyt
pytanie zadane 23 września 2021 w C i C++ przez tonn204 Mądrala (7,470 p.)
0 głosów
1 odpowiedź 790 wizyt

93,718 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,265 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...