Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Hellrider от Январь 02, 2013, 15:10



Название: Исключение при присвоении строки QLabel
Отправлено: Hellrider от Январь 02, 2013, 15:10
Не пойму почему происходит исключение, когда пытаюсь присвоить текст для QLabel. QLabel обьявлен в классе, потом в конструкторе создаю obj = new QLabel.
Дальше в обьявленном слоте происхоит присваивание текста. Ну и когда присходит присваивание программа закрывается с ошибкой. Что я не так делаю?


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Alex Custov от Январь 02, 2013, 15:15
Пишешь неправильный код, который нужно скопировать сюда и показать.


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Hellrider от Январь 02, 2013, 15:24
Тут поменял QLabel на QTextEdit. Если устанавливать текст в QTextEdit, то все устанавливается. Вот сам класс
Код:
#ifndef DATAMAP_H
#define DATAMAP_H
#include <QtGui>

class QPushButton;
class QTextEdit;
class QLineEdit;
class DataMap : public QWidget
{
    Q_OBJECT
private:
    QMap<QString, QString>map;
    QMap<QString, QString>open_map;
    QLineEdit* pKey;
    QLineEdit* pText;
    QPushButton* pSave;
    QPushButton* pSaveData;
    QPushButton* pOpen;
    QTextEdit* txt;
public:
    DataMap(QWidget* parent = 0);
public slots:
    void slotSaveData();
    void slotSave();
    void slotOpen();
};

#endif // DATAMAP_H


конструктор
Код:
DataMap::DataMap(QWidget* parent) : QWidget(parent)
{
    setFixedSize(500, 90);
    pKey = new QLineEdit;
    pText = new QLineEdit;
    pSave = new QPushButton("Save");
    pSaveData = new QPushButton("Save Data");
    pOpen = new QPushButton("Open");
    txt = new QTextEdit;

    QGridLayout* la = new QGridLayout;
    la->addWidget(pKey, 0, 0);
    la->addWidget(pText, 0, 1);
    la->addWidget(pSave, 0, 2);
    la->addWidget(pSaveData, 1, 0);
    la->addWidget(pOpen, 1, 1);
    la->addWidget(txt, 2, 0);
    setLayout(la);


    connect(pSave, SIGNAL(clicked()), SLOT(slotSave()));
    connect(pSaveData, SIGNAL(clicked()), SLOT(slotSaveData()));
    connect(pOpen, SIGNAL(clicked()), SLOT(slotOpen()));
}

слот
Код:
void DataMap::slotOpen(){
    QFile pFile("wh.dat");
    if(pFile.open(QIODevice::ReadOnly)){
        QDataStream stream(&pFile);
        stream >> open_map;
    } else QMessageBox::warning(0, "error", "Error open");
    pFile.close();
    if(open_map.isEmpty()){
        qDebug() << "map clean";
    } else qDebug() << "map full";
    QMap<QString, QString>::iterator it = open_map.find("A239");
    QString str = it.value();
    txt->setPlainText(str);
}


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Alex Custov от Январь 02, 2013, 15:29
Код для установки текста правильный, тут падать не должно и для QLabel. Допиши в конец слота такой код вместо твоего после open_map.find():

Код
C++ (Qt)
QMap<QString, QString>::iterator it = open_map.find("A239");
 
if(it == open_map.end())
   qDebug("Not found");
else
   txt->setPlainText(it.value());
 


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Hellrider от Январь 02, 2013, 15:35
Код для установки текста правильный, тут падать не должно и для QLabel. Допиши в конец слота такой код вместо твоего после open_map.find():

Код
C++ (Qt)
QMap<QString, QString>::iterator it = open_map.find("A239");
 
if(it == open_map.end())
   qDebug("Not found");
else
   txt->setPlainText(it.value());
 

Все равно падает.


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Old от Январь 02, 2013, 15:51
Все равно падает.
Ты бы показал весь код с QLabel.


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Hellrider от Январь 02, 2013, 15:59
Все равно падает.
Ты бы показал весь код с QLabel.

Код:
void DataMap::slotSave(){
    QString str_key = pKey->text();
    QString str_text = pText->text();
    if(!map.contains(str_key)){
    map.insert(str_key, str_text);
    } else QMessageBox::warning(0, "error", "error12");
    pKey->setText("");
    pText->setText("");
}

void DataMap::slotSaveData(){
    QFile file("wh.dat");
    if(file.open(QIODevice::WriteOnly)){
        QDataStream stream(&file);
        stream << map;
    } else QMessageBox::warning(0, "error", "Error Write");
    file.close();
}
Вот два слота которые не показал, но они отношения к этому не имеют. Больше ничего нету


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Hellrider от Январь 02, 2013, 16:03
Тут поменял QLabel на QTextEdit. Если устанавливать текст в QTextEdit, то все устанавливается. Вот сам класс
Код:
#ifndef DATAMAP_H
#define DATAMAP_H
#include <QtGui>

class QPushButton;
class QTextEdit;
class QLineEdit;
class DataMap : public QWidget
{
    Q_OBJECT
private:
    QMap<QString, QString>map;
    QMap<QString, QString>open_map;
    QLineEdit* pKey;
    QLineEdit* pText;
    QPushButton* pSave;
    QPushButton* pSaveData;
    QPushButton* pOpen;
    QTextEdit* txt;
public:
    DataMap(QWidget* parent = 0);
public slots:
    void slotSaveData();
    void slotSave();
    void slotOpen();
};

#endif // DATAMAP_H


конструктор
Код:
DataMap::DataMap(QWidget* parent) : QWidget(parent)
{
    setFixedSize(500, 90);
    pKey = new QLineEdit;
    pText = new QLineEdit;
    pSave = new QPushButton("Save");
    pSaveData = new QPushButton("Save Data");
    pOpen = new QPushButton("Open");
    txt = new QTextEdit;

    QGridLayout* la = new QGridLayout;
    la->addWidget(pKey, 0, 0);
    la->addWidget(pText, 0, 1);
    la->addWidget(pSave, 0, 2);
    la->addWidget(pSaveData, 1, 0);
    la->addWidget(pOpen, 1, 1);
    la->addWidget(txt, 2, 0);
    setLayout(la);


    connect(pSave, SIGNAL(clicked()), SLOT(slotSave()));
    connect(pSaveData, SIGNAL(clicked()), SLOT(slotSaveData()));
    connect(pOpen, SIGNAL(clicked()), SLOT(slotOpen()));
}

слот
Код:
void DataMap::slotOpen(){
    QFile pFile("wh.dat");
    if(pFile.open(QIODevice::ReadOnly)){
        QDataStream stream(&pFile);
        stream >> open_map;
    } else QMessageBox::warning(0, "error", "Error open");
    pFile.close();
    if(open_map.isEmpty()){
        qDebug() << "map clean";
    } else qDebug() << "map full";
    QMap<QString, QString>::iterator it = open_map.find("A239");
    QString str = it.value();
    txt->setPlainText(str);
}

опечатался выше "Если устанавливать текст в QTextEdit, то все устанавливается." - QLineEdit


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Old от Январь 02, 2013, 16:04
Вот два слота которые не показал, но они отношения к этому не имеют. Больше ничего нету
Ты показал код с QTextEdit, который работает. Покажи тот код, который не работает. :)


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Hellrider от Январь 02, 2013, 16:06
Вот два слота которые не показал, но они отношения к этому не имеют. Больше ничего нету
Ты показал код с QTextEdit, который работает. Покажи тот код, который не работает. :)

В QLineEdit работает, а в QLabel и QTextEdit нет. Если устанавливать в самом конструкторе, то все везде устанавливается, но когда из слотов устанавливать - падает.
Попробовал вызвать слот на прямую из конструктора без соединения сигнал-слот - Присваивается нормально. Не понимаю в чем проблема.
----------------------
Удалил мейк файлы и папку дебаг из проекта и о чудо - все заработало. Но как это связано все...


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Dancing_on_water от Январь 03, 2013, 10:10
А случаем не соединен ли сигнал со слотом через Qt::DirectConnection, а при этом эммитер живет в другом потоке?  

Хотя скорее вопрос надо задать так, в каком потоке вызывается конструктор твоего виджета?


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Mikhail от Январь 03, 2013, 11:12
Приложи проект который не работает.
Иначе тебе никто не подскажет


Название: Re: Исключение при присвоении строки QLabel
Отправлено: Old от Январь 03, 2013, 11:14
Так решилось же все. :)