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

VPS Starter Arubacloud
0 głosów
323 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,100 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,100 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,100 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 273 wizyt
pytanie zadane 14 października 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
+1 głos
2 odpowiedzi 285 wizyt
pytanie zadane 23 września 2021 w C i C++ przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 296 wizyt

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...