Russian Qt Forum
Ноябрь 25, 2024, 18:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Исключение при присвоении строки QLabel  (Прочитано 5724 раз)
Hellrider
Гость
« : Январь 02, 2013, 15:10 »

Не пойму почему происходит исключение, когда пытаюсь присвоить текст для QLabel. QLabel обьявлен в классе, потом в конструкторе создаю obj = new QLabel.
Дальше в обьявленном слоте происхоит присваивание текста. Ну и когда присходит присваивание программа закрывается с ошибкой. Что я не так делаю?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Январь 02, 2013, 15:15 »

Пишешь неправильный код, который нужно скопировать сюда и показать.
Записан
Hellrider
Гость
« Ответ #2 : Январь 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);
}
« Последнее редактирование: Январь 02, 2013, 15:26 от Hellrider » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Январь 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());
 
Записан
Hellrider
Гость
« Ответ #4 : Январь 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());
 

Все равно падает.
« Последнее редактирование: Январь 02, 2013, 15:49 от Hellrider » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Январь 02, 2013, 15:51 »

Все равно падает.
Ты бы показал весь код с QLabel.
Записан
Hellrider
Гость
« Ответ #6 : Январь 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();
}
Вот два слота которые не показал, но они отношения к этому не имеют. Больше ничего нету
Записан
Hellrider
Гость
« Ответ #7 : Январь 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
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Январь 02, 2013, 16:04 »

Вот два слота которые не показал, но они отношения к этому не имеют. Больше ничего нету
Ты показал код с QTextEdit, который работает. Покажи тот код, который не работает. Улыбающийся
Записан
Hellrider
Гость
« Ответ #9 : Январь 02, 2013, 16:06 »

Вот два слота которые не показал, но они отношения к этому не имеют. Больше ничего нету
Ты показал код с QTextEdit, который работает. Покажи тот код, который не работает. Улыбающийся

В QLineEdit работает, а в QLabel и QTextEdit нет. Если устанавливать в самом конструкторе, то все везде устанавливается, но когда из слотов устанавливать - падает.
Попробовал вызвать слот на прямую из конструктора без соединения сигнал-слот - Присваивается нормально. Не понимаю в чем проблема.
----------------------
Удалил мейк файлы и папку дебаг из проекта и о чудо - все заработало. Но как это связано все...
« Последнее редактирование: Январь 02, 2013, 17:00 от Hellrider » Записан
Dancing_on_water
Гость
« Ответ #10 : Январь 03, 2013, 10:10 »

А случаем не соединен ли сигнал со слотом через Qt::DirectConnection, а при этом эммитер живет в другом потоке?  

Хотя скорее вопрос надо задать так, в каком потоке вызывается конструктор твоего виджета?
« Последнее редактирование: Январь 03, 2013, 10:13 от Dancing_on_water » Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #11 : Январь 03, 2013, 11:12 »

Приложи проект который не работает.
Иначе тебе никто не подскажет
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Январь 03, 2013, 11:14 »

Так решилось же все. Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.186 секунд. Запросов: 23.