Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt4] ошибка при закрытии тестовой программки 
V
    Опции темы
anatox91
Дата 12.3.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

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



при первой же моей попытке поэкпериментировать с Qt, наткнулся на ошибку - при нажатии на кнопку Quit вылезает ошибка Windows (типа приложение будет закрыто из-за ошибки, просим извинения за неудобства), а если закрываю обычным красным крестиком то окошко исчезает, но в процессах остается висеть... помогите пожалуйста разобраться, вот код:
Код

#include <QLabel>
#include <QApplication>
#include <QPushButton>
#include <QSpinBox>
#include <QWidget>
#include <QSlider>
#include <QHBoxLayout>
#include <QVBoxLayout>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("Age");
    window.setWindowFlags(Qt::Tool);
    QLabel label("Change your age: ");
    QPushButton button("Quit");
    QObject::connect(&button, SIGNAL(clicked()), &app, SLOT(quit()));
    QSpinBox spinbox;
    spinbox.setRange(0, 130);
    QSlider slider(Qt::Horizontal);
    slider.setRange(0, 130);
    QObject::connect(&spinbox, SIGNAL(valueChanged(int)), &slider, SLOT(setValue(int)));
    QObject::connect(&slider, SIGNAL(valueChanged(int)), &spinbox, SLOT(setValue(int)));
    spinbox.setValue(35);
    QHBoxLayout spinbox_slider;
    spinbox_slider.addWidget(&spinbox);
    spinbox_slider.addWidget(&slider);
    QVBoxLayout main;
    main.addWidget(&label);
    main.addLayout(&spinbox_slider);
    main.addWidget(&button);
    window.setLayout(&main);
    window.show();
    return app.exec();
}



--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
SABROG
Дата 12.3.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



А этот пример из Qt нормально работает ?

Код

#include <QApplication>
#include <QFont>
#include <QPushButton>

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);

     QPushButton quit("Quit");
     quit.resize(75, 30);
     quit.setFont(QFont("Times", 18, QFont::Bold));

     QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit()));

     quit.show();
     return app.exec();
 } 


Используй отладчик.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
anatox91
Дата 12.3.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

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



SABROG, твой пример абсолютно нормально работает, а вот мой - нет... хотя вроде коннект тот же... 


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
SABROG
Дата 12.3.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Ну глянь в отладчике.

Это сообщение отредактировал(а) SABROG - 12.3.2008, 15:18


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
anatox91
Дата 12.3.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

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



жаль, но я никогда не работал с отладчиком и вообще не умею им пользоваться... smile  smile 


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
anatox91
Дата 12.3.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

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



а есть какие-нибудь книги по нему?

сорри за два поста

Это сообщение отредактировал(а) anatox91 - 12.3.2008, 15:45


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
SABROG
Дата 12.3.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(anatox91 @ 12.3.2008,  15:40)
а есть какие-нибудь книги по нему?

сорри за два поста

На попытке освободить память под какой-то gui'шный объект его выбивает в ntdll:

Код

Invalid Address specified to RtlFreeHeap( 3ee0000, 22fef0 )



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
anatox91
Дата 12.3.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

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



и как можно этого избежать? во всех других примерах с такой же кнопкой работает нормально, а тут на тебе...


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
SABROG
Дата 12.3.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Косяков здесь 2. Первый это попытка Qt удалить самой указатели на дочернией QObject'ы, ей это успешно удается, поэтому при покидании основного блока программы ОС пытается вызвать деструктор еще раз, ибо Qtшные классы создавались в стеке, а не через new. Второй косяк в том, что ты меняешь флаг окна на Tool, похоже Qt считает, что для этого окна родителем является рабочий стол и выход не происходит по quitOnLastWindowClosed (т.е. когда последнее окно приложения закрывается). Эта проблема где-то обсуждалась уже, но решение я не помню. А так вот рабочая версия:

Код

#include <QLabel>
#include <QApplication>
#include <QPushButton>
#include <QSpinBox>
#include <QWidget>
#include <QSlider>
#include <QHBoxLayout>
#include <QVBoxLayout>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("Age");
    //window.setWindowFlags(Qt::Tool);
    QLabel *label = new QLabel("Change your age: ");
    QPushButton *button = new QPushButton("Quit");
    QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
    QSpinBox *spinbox = new QSpinBox;
    spinbox->setRange(0, 130);
    QSlider *slider = new QSlider(Qt::Horizontal);
    slider->setRange(0, 130);
    QObject::connect(spinbox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
    QObject::connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));
    spinbox->setValue(35);
    QHBoxLayout *spinbox_slider = new QHBoxLayout;
    spinbox_slider->addWidget(spinbox);
    spinbox_slider->addWidget(slider);
    QVBoxLayout *main = new QVBoxLayout;
    main->addWidget(label);
    main->addLayout(spinbox_slider);
    main->addWidget(button);
    window.setLayout(main);
    window.show();
    return app.exec();
}



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
just_geek
Дата 12.3.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



создавай виджеты динамически и указывай у виджетов родителя, иначе непонятно в каком порядке они будут уничтожатся...

Код

#include <QLabel>
#include <QApplication>
#include <QPushButton>
#include <QSpinBox>
#include <QWidget>
#include <QSlider>
#include <QHBoxLayout>
#include <QVBoxLayout>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget window;
    window.setWindowTitle("Age");
    window.setWindowFlags(Qt::Tool);
    QLabel *label = new QLabel("Change your age: ", &window);
    QPushButton *button = new QPushButton("Quit", &window);
    QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
    QSpinBox *spinbox = new QSpinBox(&window);
    spinbox->setRange(0, 130);
    QSlider *slider = new QSlider(Qt::Horizontal, &window);
    slider->setRange(0, 130);
    QObject::connect(spinbox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
    QObject::connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));
    spinbox->setValue(35);
    QHBoxLayout *spinbox_slider = new QHBoxLayout(&window);
    spinbox_slider->addWidget(spinbox);
    spinbox_slider->addWidget(slider);
    QVBoxLayout *main = new QVBoxLayout(&window);
    main->addWidget(label);
    main->addLayout(spinbox_slider);
    main->addWidget(button);
    window.setLayout(main);
    window.show();
    return app.exec();
}


вот так все замечательно работает...
PM MAIL   Вверх
SABROG
Дата 12.3.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

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



Цитата(just_geek @  12.3.2008,  17:51 Найти цитируемый пост)
создавай виджеты динамически и указывай у виджетов родителя, иначе непонятно в каком порядке они будут уничтожатся...


Чет ты нашаманил

user posted image


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
anatox91
Дата 12.3.2008, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

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



SABROG, большое тебе спасибо, разобрался наконец-то, вот конечный код
Код

#include <QtGui>
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QWidget *window = new QWidget;
    window->setWindowTitle("Age");
    window->setWindowFlags(Qt::WindowMinimizeButtonHint);
    QLabel *label = new QLabel("Change your age: ");
    QPushButton *button = new QPushButton("Quit");
    QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
    QSpinBox *spinbox = new QSpinBox;
    spinbox->setRange(0, 130);
    QSlider *slider = new QSlider(Qt::Horizontal);
    slider->setRange(0, 130);
    QObject::connect(spinbox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
    QObject::connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int)));
    spinbox->setValue(35);
    QHBoxLayout *spinbox_slider = new QHBoxLayout;
    spinbox_slider->addWidget(spinbox);
    spinbox_slider->addWidget(slider);
    QVBoxLayout *mainl = new QVBoxLayout;
    mainl->addWidget(label);
    mainl->addLayout(spinbox_slider);
    mainl->addWidget(button);
    window->setLayout(mainl);
    window->show();
    return app.exec();
}



--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
just_geek
Дата 13.3.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SABROG,  smile главное заработало
PM MAIL   Вверх
anatox91
Дата 13.3.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

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



Цитата(SABROG)

Чет ты нашаманил

эт из-за того что под все виджеты память динамически выделяется, а под главный QWidget (window) - нет...



--------------------

The code is the design ©

Sony VAIO VGN-FW480J

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

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

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


 




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


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

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