Название: Исключение при присвоении строки 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
Так решилось же все. :)
|