• 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++

Object Storage Arubacloud
0 głosów
332 wizyt
pytanie zadane 1 listopada 2021 w C i C++ przez tonn204 Mądrala (7,440 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 Ekspert (344,860 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,440 p.)
Czyli, żeby go ustawić powinienem stworzyć oddzielną zmienną?
komentarz 1 listopada 2021 przez adrian17 Ekspert (344,860 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,440 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 Ekspert (344,860 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 276 wizyt
pytanie zadane 14 października 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
+1 głos
2 odpowiedzi 288 wizyt
pytanie zadane 23 września 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 297 wizyt

92,551 zapytań

141,399 odpowiedzi

319,531 komentarzy

61,938 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...