Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обвал по таймеру 
:(
    Опции темы
hexzo
Дата 21.4.2011, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Почему, если я хочу провести какие-то манипуляции с интерфейсом по таймеру, который срабатывает после старта приложения, то прога обваливается.

main.cpp
Код

#include <QtGui>
#include "widget.h"

using namespace std;

int main(int argc, char **argv) {
    QApplication app(argc, argv);
    MyWidg *widg = new MyWidg;
    widg->show();

    QTimer *timer = new QTimer;
    timer->setSingleShot(1);
    timer->start(1000);
    QObject::connect(timer, SIGNAL(timeout()), widg, SLOT(doit()));
    return app.exec();
}


widget.h
Код

#include <QtGui>

class MyWidg : public QWidget {
    Q_OBJECT
public:
    MyWidg();
private:
    QHBoxLayout *hlayout;
    QTextEdit *label;
public slots:
    void doit();
};


widget.cpp
Код

#include "widget.h"

MyWidg::MyWidg() : MyWidg::QWidget(0) {
    QTextEdit *label = new QTextEdit;
    QHBoxLayout *hlayout = new QHBoxLayout(this);
    hlayout->addWidget(label);    
}

void MyWidg::doit() {
    label->setText("new text");  //вот оно, падение
}


P.S. Конструктор стопудово отрабатывает до начала работы слота doit(), я qDebugами проверял. И если в слоте doit() что-нибудь делать не с элементами интерфейса, то всё работает путём.
PM MAIL   Вверх
Modul
Дата 21.4.2011, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



Цитата(hexzo @  21.4.2011,  13:41 Найти цитируемый пост)
Почему, если я хочу провести какие-то манипуляции с интерфейсом по таймеру, который срабатывает после старта приложения, то прога обваливается.


Ты 2 раза объявил label.
Код

 QTextEdit *label = new QTextEdit;


Надо так:
Код

label = new QTextEdit;


А это что ?
Код

MyWidg::MyWidg() : MyWidg::QWidget(0) {...



Это сообщение отредактировал(а) Modul - 21.4.2011, 14:40
--------------------
I'll be back !
PM MAIL   Вверх
hexzo
Дата 21.4.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 178
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(Modul @  21.4.2011,  14:32 Найти цитируемый пост)
Ты 2 раза объявил label.

Ой, на такие грабли я ещё ни разу не наступал.  smile 

А почему в конструкторе всё как надо работает, то есть можно с label что угодно делать, а в слоте при обращении к label происходит обвал? Это разные ссылки что ли?  smile 
PM MAIL   Вверх
math64
Дата 21.4.2011, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Кстати, точно также два раза объявлен hlayout - но он в слоте не используется, так что его можно не объявлять полем класса.
В конструкторе создаётся локальная переменная label, а поле класса label остаётся неинициализированным (даже не NULL!)
В doIt() обращается к этому мусору в label и происходит обвал.
Пиши в конструкторе
Код

QTextEdit *label = new QTextEdit;
this->label = label

или
Код

this->label = new QTextEdit;

или 
Код

label = new QTextEdit;
 

PM   Вверх
borisbn
Дата 21.4.2011, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(hexzo @  21.4.2011,  14:43 Найти цитируемый пост)
А почему в конструкторе всё как надо работает, то есть можно с label что угодно делать, а в слоте при обращении к label происходит обвал? Это разные ссылки что ли?   

 smile 

Цитата(hexzo @  21.4.2011,  13:41 Найти цитируемый пост)
QTextEdit *label = new QTextEdit;

создаёт "местную" переменную, с которой ты можешь делать всё, что хочешь до выхода из ф-ции


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.