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

[Qt] ToPlainText()

Object Storage Arubacloud
0 głosów
434 wizyt
pytanie zadane 14 maja 2015 w C i C++ przez Linker Bywalec (2,690 p.)

Witam. Mam problem. Po naciśnięciu przycisku wyskakuje okno QDialog i w tym oknie mam slot w którym chcę aby text z QTextEdit przypisał stringowi. Oto kod:

#include "qdialog.h"

Dialog::Dialog(QWidget *parent)
    :QDialog(parent)
{
    QTextEdit *imie = new QTextEdit(this);
    imie->setGeometry(100, 10, 120, 25);
    imie->show();
    QTextEdit *nazwisko = new QTextEdit(this);
    nazwisko->setGeometry(100, 50, 120, 25);
    nazwisko->show();
    QLabel *label1 = new QLabel("Imię:", this, 0);
    label1->setGeometry(60, 10, 80, 25);
    label1->show();
    QLabel *label2 = new QLabel("Nazwisko:", this, 0);
    label2->setGeometry(50, 45, 80, 25);
    label2->show();
    QPushButton *button_ok = new QPushButton("OK",this);
    button_ok->setGeometry(110, 85, 100, 50);
    connect(button_ok, SIGNAL(clicked()), this, SLOT(exit()));
    button_ok->show();

}
Dialog::~Dialog()
{

}

void Dialog::exit()
{
    QString a;
    a = "abc";
    a = imie->toPlainText();
    nazwisko->setText(a);
    label1->setText(a);
    QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection);
}

 

#ifndef QDIALOG
#define QDIALOG
#include <QLabel>
#include <QWidget>
#include <QDialog>
#include <QTextEdit>
#include <QPushButton>
#include <QMetaObject>
#include <QString>
#include <QPlainTextEdit>

class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
private:
    QTextEdit *imie;
    QLabel *label1;
    QTextEdit *nazwisko;
    QLabel *label2;
    QPushButton *button_ok;
    QString a;
private slots:
    void exit();
};

#endif // QDIALOG

 

Lecz gdy wcisnę buttona ok to wtedy program się wyłącza i wyskakuje okno "Wystąpił problem z aplikacją i zostanie ona zamknięta....."(to z przyciskami Wyślij raport o błędach i Nie wysyłaj)

2 odpowiedzi

0 głosów
odpowiedź 16 maja 2015 przez Bartek85 Mądrala (7,440 p.)
wybrane 16 maja 2015 przez Linker
 
Najlepsza

Odpowiedź wydaję się bardzo prosta. W konstruktorze, źle alokujesz pamięć.

plik qdialog.cpp:

Dialog::Dialog(QWidget *parent)

    :QDialog(parent)

{

    QTextEdit *imie = new QTextEdit(this);

    imie->setGeometry(100, 10, 120, 25);

    imie->show();

    QTextEdit *nazwisko = new QTextEdit(this);

    nazwisko->setGeometry(100, 50, 120, 25);

    nazwisko->show();

    QLabel *label1 = new QLabel("Imię:", this, 0);

    label1->setGeometry(60, 10, 80, 25);

    label1->show();

    QLabel *label2 = new QLabel("Nazwisko:", this, 0);

    label2->setGeometry(50, 45, 80, 25);

    label2->show();

    QPushButton *button_ok = new QPushButton("OK",this);

    button_ok->setGeometry(110, 85, 100, 50);

    connect(button_ok, SIGNAL(clicked()), this, SLOT(exit()));

    button_ok->show();

}

Powinno być:

Dialog::Dialog(QWidget *parent)

    :QDialog(parent)

{

    imie = new QTextEdit(this);

    imie->setGeometry(100, 10, 120, 25);

    imie->show();

    nazwisko = new QTextEdit(this);

    nazwisko->setGeometry(100, 50, 120, 25);

    nazwisko->show();

    label1 = new QLabel("Imię:", this, 0);

    label1->setGeometry(60, 10, 80, 25);

    label1->show();

    label2 = new QLabel("Nazwisko:", this, 0);

    label2->setGeometry(50, 45, 80, 25);

    label2->show();

    button_ok = new QPushButton("OK",this);

    button_ok->setGeometry(110, 85, 100, 50);

    connect(button_ok, SIGNAL(clicked()), this, SLOT(exit()));

    button_ok->show();

}

Błędem jest zła alokacja pamięci, przez co wynikiem jest wyciek, a pola w klasie nadal są nie zaalokowane. Stąd dostajesz naruszenie pamięci Access Violation.

Używając linijki:

QTextEdit *imie = new QTextEdit(this);

przysłania zmienną "imie", która jest składową klasy, na zmienną lokalną która jest w konstruktorze. Efektem tego jest wyciek pamięci, ponieważ nie masz już dostępu do obiektu który zaalokowałeś w konstruktorze. A druga sprawa, najważniejsza, przez co masz AV(Access Violation), to to, że zmina składowa w klasie, do której chcesz się odwołać w metodzie exit(), po prostu nie istnieje(nie została zaalokowana) i odwołujesz się do miejsca w pamięci które nie istnieje.

 

 

 

 

komentarz 16 maja 2015 przez Linker Bywalec (2,690 p.)
Dziękuję za wyjaśninie i pomoc.
0 głosów
odpowiedź 14 maja 2015 przez Wiciorny Ekspert (272,510 p.)
Siemano używasz dynamicznej tablicy, wydaje mi się że zapomniałeś o zwolnieniu pamięci / czyli usunięciu bufora
komentarz 14 maja 2015 przez Linker Bywalec (2,690 p.)
Gdzie mam tablicę? Nie za długo zajmuję się qt więc nie wiem o jaką tablicę ci chodzi, przecież nigdzie nie deklarowałem tablicy. Mylę się?
komentarz 14 maja 2015 przez Wiciorny Ekspert (272,510 p.)

bardziej chodziło mi o to, że tworzysz wskażnik do nowego obszaru pamięci który nie zwalniasz 

QTextEdit *imie = new QTextEdit(this);

Z 2 strony, może po prostu obszar który tworzysz w pamięci jest zbyt mały na przechowanie ilości danych i wywala błąd 

komentarz 15 maja 2015 przez Linker Bywalec (2,690 p.)
Błąd występuje dopiero gdy wywołuje slot, a już wcześniej jest zadeklarowany ten wskaźnik. Okno QDialog wyskakuje.

Podobne pytania

0 głosów
0 odpowiedzi 98 wizyt
+1 głos
0 odpowiedzi 137 wizyt
0 głosów
0 odpowiedzi 121 wizyt
pytanie zadane 28 grudnia 2022 w C i C++ przez M1983 Nowicjusz (120 p.)

92,698 zapytań

141,614 odpowiedzi

320,144 komentarzy

62,058 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!

...