crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Программка виснет при нажатии кнопочки, споткнулся на ровном месте...
igorenja
  опции профиля:
сообщение 2.2.2010, 12:53
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 18.1.2010
Пользователь №: 1384

Спасибо сказали: 1 раз(а)




Репутация:   0  


Доброе время суток всем.
Написал микро программку а она зараза виснет при нажатии кнопочки:

CODE

#ifndef TBASEWINDOW_H
#define TBASEWINDOW_H

#include <QWidget>
class QLabel;
class QPushButton;

class TBaseWindow : public QWidget
{
Q_OBJECT
public:
TBaseWindow(QWidget *parent=0);

protected:
QLabel *help;

private:
QLabel *logo;
QPushButton *But;
private slots:
void click();
};

#endif // TBASEWINDOW_H



CODE

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

TBaseWindow::TBaseWindow(QWidget *parent)
:QWidget(parent)
{

QLabel *help = new QLabel(this);
help->setText(QString("Welcome!!!"));
help->setFont(QFont("Times", 25, QFont::Bold));
help->setGeometry(QRect(QPoint(200, 500), help->sizeHint()));

QPushButton *But = new QPushButton(this);
But->setGeometry(QRect(QPoint(300, 300), But->sizeHint()));

connect(But,SIGNAL(clicked()),this,SLOT(click()));
setFixedSize(600,600);
}

void TBaseWindow::click()
{
help->setText(QString("hdhgdhgdhgdghd"));
}



CODE

#include <QApplication>
#include "tbasewindow.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
TBaseWindow *dialog = new TBaseWindow;
dialog->show();
return app.exec();
}


В чём дело подскажите пожалуйста...

И ещё вопрос: При компиляции примеров в папке проектов Release появляется exe-шник, который не запускается отдельно от Qt. Вопрос что нужно сделать чтобы после компиляции был запускаемый на любом компьютере exe-шник.

Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lucifer_vrn
  опции профиля:
сообщение 2.2.2010, 13:07
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 27.2.2009
Пользователь №: 580

Спасибо сказали: 3 раз(а)




Репутация:   0  


ничего удивительного. ты конечно не обижайся, но это код достойный очутиться на сайте говнокод.ру....
QLabel *help; у тебя определен в хедере.
а ты еще в сипипишнике еще один определяешь, в итоге у тебя выходит, что тот что в хедере не иницилизирован и обращение в слоте происходит к рандомному участку памяти.
короче говоря твой сипипи должен быть такой.
include <QtGui>
#include "tbasewindow.h"

TBaseWindow::TBaseWindow(QWidget *parent)
    :QWidget(parent)
{

    help = new QLabel(this);
    help->setText(QString("Welcome!!!"));
    help->setFont(QFont("Times", 25, QFont::Bold));
    help->setGeometry(QRect(QPoint(200, 500), help->sizeHint()));

    But = new QPushButton(this);
    But->setGeometry(QRect(QPoint(300, 300), But->sizeHint()));

    connect(But,SIGNAL(clicked()),this,SLOT(click()));
    setFixedSize(600,600);
}

void TBaseWindow::click()
{
    help->setText(QString("hdhgdhgdhgdghd"));
}

Еще пара замечаний: 1. Зачем у тебя часть переменных в private часть в protected. Если ты конечно от этого класса не собираешь потом наследоваться....
2. But->setGeometry(QRect(QPoint(300, 300), But->sizeHint())); - мега жесть. Кури про QLayout, в частности QVBoxLayout и QHBoxLayout.


Цитата(igorenja @ 2.2.2010, 12:53) *
И ещё вопрос: При компиляции примеров в папке проектов Release появляется exe-шник, который не запускается отдельно от Qt. Вопрос что нужно сделать чтобы после компиляции был запускаемый на любом компьютере exe-шник.


чтоб запускалься на машине под виндой, где уже установлен куте, нужно в системе переменную path дополнить строкой типа "C:\Qt\2010.01\mingw\bin;C:\Qt\2010.01\qt\bin"
или положить кучу дллок от куте в папку с бинарем. дллк из этих папок bin. Все не обязательно, надо смотреть какие именно использует твое приложение, кроме того там их по две разных одна типа для дебуга другая релиз...
есть еще один выход - статическая линковка, но я сколько не парился - у меня не получилось... если кто подскажет как это сделать буду благодарен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igorenja
  опции профиля:
сообщение 2.2.2010, 13:16
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 18.1.2010
Пользователь №: 1384

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(lucifer_vrn @ 2.2.2010, 16:07) *
QLabel *help; у тебя определен в хедере.
а ты еще в сипипишнике еще один определяешь, в итоге у тебя выходит, что тот что в хедере не иницилизирован и обращение в слоте происходит к рандомному участку памяти.


Спасибо большое тупанул по чёрному (плюсы тока изучаю). Пару комментариев добавлю
Цитата(lucifer_vrn @ 2.2.2010, 16:07) *
1. Зачем у тебя часть переменных в private часть в protected. Если ты конечно от этого класса не собираешь потом наследоваться....

Это определение базового класса, его свойства будут наследовать производные классы.
Цитата(lucifer_vrn @ 2.2.2010, 16:07) *
2. But->setGeometry(QRect(QPoint(300, 300), But->sizeHint())); - мега жесть. Кури про QLayout, в частности QVBoxLayout и QHBoxLayout.

Спасибо за совет. Лэйауты я курил.... и много... Дело в том что сие твоерение будет работать на Embedded Linux в очень специфичной целезке, Там нужно точно позиционировать объекты на экране. Менеджеры компоновки там юзать не желательно....

Ну так а всё же, как скомпилировать так проект чтоб исполняемый файл работал хоть где?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 2.2.2010, 13:34
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата
Ну так а всё же, как скомпилировать так проект чтоб исполняемый файл работал хоть где?

перейти на java
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 2.2.2010, 13:50
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(igorenja @ 2.2.2010, 13:16) *
Ну так а всё же, как скомпилировать так проект чтоб исполняемый файл работал хоть где?
Смотри в сторону статической сборки Qt, правда размер твоего exe файла вырастет в разы. Да и не вижу проблем, чтобы таскать с собой нужные тебе библиотеки, если все же предпочтешь нынешнюю динамическую сборку...

Цитата(kuzulis @ 2.2.2010, 13:34) *
перейти на java
kuzulis, лучше промолчать, чем сказать ерунду... ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.2.2010, 23:13
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


igorenja, не называй так больше тему ("Помогите новичку, споткнулся на ровном месте..."), такое название не информативно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igorenja
  опции профиля:
сообщение 3.2.2010, 5:59
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 18.1.2010
Пользователь №: 1384

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 3.2.2010, 2:13) *
igorenja, не называй так больше тему ("Помогите новичку, споткнулся на ровном месте..."), такое название не информативно.


Ок, исправлюсь...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.2.2010, 21:13
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


тему разделил - Правила именования идентификаторов в С++
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igorenja
  опции профиля:
сообщение 5.2.2010, 8:41
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 18.1.2010
Пользователь №: 1384

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(lucifer_vrn @ 2.2.2010, 16:07) *
... еще один выход - статическая линковка, но я сколько не парился - у меня не получилось... если кто подскажет как это сделать буду благодарен.


1. В командной строке
path %PATH%;C:\Qt\2009.05\qt\bin;C:\Qt\2009.05\mingw\bin

2. Правим файл win32-g++\qmake.conf
QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
заменяем на:
QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc

3. Пересобираем Qt таким образом:
configure -static -release -no-exceptions -platform win32-g++

4. Минут 15 курим бамбук, потом вбиваем:
mingw32-make sub-src

5. Снова курим бамбук тока 3-4 часа, потом йузаем.

П.С. Собираться будет только релис, дебуг не будет. Для дебуга видимо нуно использовать опцию -debug-and-release при конфигурировании

П.П.С. у меня работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 3:47