Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] компилится но не работает


Автор: nanoo 19.10.2007, 19:19
Привет всем юниксоидам. Есть такой простенький код
Цитата

#include<qapplication>
#include<qmessagebox>
#include<qpushbutton>

class hw: public QPushButton
{
Q_OBJECT
public:
hw(QWidget *parent);
public slots:
void hello();
};

hw::hw(QWidget *parent=0):QPushButton("hello world")
{
connect(this,SIGNAL(clicked()),SLOT(hello()));
}

void hw::hello()
{
QMessageBox::information(this,"hello world","hello world");
}

int main(int ac, char* av[])
{
QApplication app(ac,av);
hw mw;
mw.show();
return app.exec();
}
#include"main.moc"

суть простая, нажимаешь кнопочку - появляется меседжбокс. Только вот не появляется этот меседжбокс! В чем грабли не пойму. Версия 4.2. 
Заранее спасибо.

Автор: nickless 19.10.2007, 19:38
У меня появляется (если инклюды написать как положено с большой буквы).
Как и в чем компилируем, что пишет в консоли?

Автор: JackYF 19.10.2007, 19:44
Цитата(nanoo @  19.10.2007,  19:19 Найти цитируемый пост)
connect(this,SIGNAL(clicked()),SLOT(hello()));

connect(this,SIGNAL(clicked()),this,SLOT(hello()));

упс, значит и так можно.

Автор: nanoo 19.10.2007, 20:14
Цитата(nickless @ 19.10.2007,  19:38)
У меня появляется (если инклюды написать как положено с большой буквы).
Как и в чем компилируем, что пишет в консоли?

Компилирую под виндой хр при помощи минжв.  smile 

А зачем большие букавки в инклюдах то? мона и маленькие. Это, кажется, в документации написано. smile 

Что пишет? Ну что обычно компилер пишет? что делает, то и пишет. Это как в анекдоте: небыло у юниксоидов скринсейверов, они и придумали configure+make. Только я програмер такой себе. Занимаюсь кодингом долго уже, но редко. В общем, не ламер. Поэтому сообщения компилера об ошибках различаю. Так вот компилится все на ура. версия qt  4.2

Я вот что думаю, может это в библиотеке баг какой-то... Или это я такой пряморукий....  smile 

===
зы винда у меня, это с новым местом работы связано. Преданый линуксоид два.пять года уже. Начинал с кнопикса, потом сюзи9.1 была, через полгода дебиан3.1 поставил. Теперь в основном убунту юзаю. Поставить времени нету.  smile 

Автор: nickless 19.10.2007, 22:27
Цитата(nanoo @  19.10.2007,  19:14 Найти цитируемый пост)
А зачем большие букавки в инклюдах то? мона и маленькие. Это, кажется, в документации написано.

Ссылку в студию smile 
Во всех примерах и туториалах Qt использует названия с большими буквами, и файлы так называются, под виндой файловая система case insensitiv, поэтому наверно и работает...

Цитата(nanoo @  19.10.2007,  19:14 Найти цитируемый пост)
Что пишет? Ну что обычно компилер пишет? что делает, то и пишет. 

Вот это и интересно smile 
Я имел ввиду вообще комманду, которой компилируется и линкуется, может там либы не подключена или еще чего, варнинги итд.
И что пишет сама программа при запуске в консоли, желательно скомпилированная со включенным дебагом итд.

Короче дополнительная информация нужна, а с телепатами у нас как то не густо... smile 

Автор: archimed7592 20.10.2007, 11:38
Цитата(nanoo @  19.10.2007,  19:19 Найти цитируемый пост)
Только вот не появляется этот меседжбокс!

Что возвращает connect?

Уверен, что moc отрабатывает?


Цитата(nanoo @  19.10.2007,  20:14 Найти цитируемый пост)
А зачем большие букавки в инклюдах то? мона и маленькие. Это, кажется, в документации написано. smile 

Либо QHBoxLayout, либо qhboxlayout.h... Маленькими можно только в винде ибо она не чуствительна к регистру в именах сущностей ФС. На линухе такое не скомпилиться.


Цитата(nanoo @  19.10.2007,  20:14 Найти цитируемый пост)
Что пишет? Ну что обычно компилер пишет?

Если ты так уверен, что делаешь всё правильно, что даже не хочешь сообщить нам что именно ты делаешь, то зачем задавать здесь вопросы?

Автор: nanoo 20.10.2007, 12:20
Скриншот приклеплен.
Насчет дебугера. Я его включать не умею ибо никогда не использовал. Как?
Большие буковки... да с этим согласен, признаю, что не прав.

Добавлено через 7 минут и 4 секунды
Ага. Коннект не срабатывает. У кого какие идеи?

Автор: archimed7592 20.10.2007, 12:29
nanoo, во-первых, измени вот это:
Код
#include <cassert>
// ...
bool connected = connect(this,SIGNAL(clicked()),SLOT(hello()));
assert(connected);

Во-вторых, никогда не делай скриншотов... Неужели сложно написать
mingw32-make > make.log 2>&1
и выложить содержимое make.log?

В-третьих сделай mingw32-make clean и только потом просто mingw32-make - и выложи лог.
И ещё, покажи содержимое своего .pro

Добавлено через 1 минуту и 44 секунды
Цитата
Ага. Коннект не срабатывает. У кого какие идеи?

Ага, идеи в том, что не отрабатывает moc. Зачем изобретаешь велосипеды? Нельзя что ль перенести описание класса в .h? Зачем нужен main.moc? Зачем делать работу за утилиты, которые эту работу должны делать сами?

Автор: nanoo 20.10.2007, 12:32
Ага. С moc я чето не то сделал. Сгенерил main.moc опять в ручную и заработало.
Всем спасибо.

Автор: archimed7592 20.10.2007, 12:54
Цитата(nanoo @  20.10.2007,  12:32 Найти цитируемый пост)
Ага. С moc я чето не то сделал. Сгенерил main.moc опять в ручную и заработало.

Открой секрет: зачем делать это вручную?

Автор: nickless 20.10.2007, 15:32
Я кстати компилировал qmake-ом, он всё автоматически сделал как надо smile 
Код

qmake -project bla && qmake && make 

Автор: archimed7592 20.10.2007, 15:38
Цитата(nickless @  20.10.2007,  15:32 Найти цитируемый пост)
qmake -project

Не может такого быть - moc не обрабатывает .cpp файлы, пока явно не укажешь.

Автор: nickless 20.10.2007, 15:51
Цитата(archimed7592 @  20.10.2007,  14:38 Найти цитируемый пост)
Не может такого быть - moc не обрабатывает .cpp файлы, пока явно не укажешь.

Ну у меня работает smile , возможно новая фича...
Код
% ls
main.cpp

% qmake -project bla && qmake && make
/usr/bin/moc -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. main.cpp -o main.moc
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. -I. -o main.o main.cpp
main.cpp:14: warning: unused parameter ‘parent’
g++  -o bla main.o    -L/usr/lib/qt4 -lQtGui -L/usr/lib/mysql -L/usr/lib/qt4 -L/usr/lib -lpng -lSM -lICE -pthread -pthread -lXrender -lXrandr -lXfixes -lXcursor -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread

% ls
bla  bla.pro  main.cpp  main.moc  main.o  Makefile

% qmake -v
QMake version 2.01a
Using Qt version 4.3.2 in /usr/lib/qt4

% moc -v
Qt Meta Object Compiler version 59 (Qt 4.3.2)

Автор: nanoo 21.10.2007, 17:12
Цитата(archimed7592 @ 20.10.2007,  12:54)
Цитата(nanoo @  20.10.2007,  12:32 Найти цитируемый пост)
Ага. С moc я чето не то сделал. Сгенерил main.moc опять в ручную и заработало.

Открой секрет: зачем делать это вручную?

Да это так... что бы меньше файлов писать. Например напишешь какой-нить class.h и там опять кучку инклюдов. В больших проектах этого лучше не делать.

Кстати, попробывал без moc - да, действительно работает. Но #include"main.moc" в конце все равно должно быть.

Автор: bsa 24.10.2007, 11:25
Цитата(nanoo @ 21.10.2007,  17:12)
Да это так... что бы меньше файлов писать. Например напишешь какой-нить class.h и там опять кучку инклюдов. В больших проектах этого лучше не делать.

1. Кучу инклюдов совсем подключать не обязательно. Достаточно в хидере объявить классы, на которые ссылаешься:
Код
#ifndef MYCLASS_H
# define MYCLASS_H
# include <QWidget>

class QLabel;
class QSplitter;
class QPushButton;

class MyClass : public QWidget
{
        Q_OBJECT
        QLabel *label;
        QSplitter *splitter;
        QPushButton *buttonOk;
public:
        MyClass();
        ~MyClass(){}
};
#endif //MYCLASS_H
а в cpp подключить <QtGui>:
Код
#include <QtGui>
#include "MyClass.h"

MyClass::MyClass()
{
        setLayout(new QHBoxLayout);
        layout()->addWidget(splitter = new QSplitter);
        splitter->addWidget(label = new QLabel(tr("test")));
        splitter->addWidget(buttonOk = new QPushButton(tr("&OK")));
}

2. На счет больших проектов ты ошибаешься. В больших проектах надо создавать директории, в которых надо группировать все по смыслу.

Автор: nanoo 24.10.2007, 19:12
Цитата(bsa @ 24.10.2007,  11:25)
Цитата(nanoo @ 21.10.2007,  17:12)
Да это так... что бы меньше файлов писать. Например напишешь какой-нить class.h и там опять кучку инклюдов. В больших проектах этого лучше не делать.

1. Кучу инклюдов совсем подключать не обязательно. Достаточно в хидере объявить классы, на которые ссылаешься:
Код
#ifndef MYCLASS_H
# define MYCLASS_H
# include <QWidget>

class QLabel;
class QSplitter;
class QPushButton;

class MyClass : public QWidget
{
        Q_OBJECT
        QLabel *label;
        QSplitter *splitter;
        QPushButton *buttonOk;
public:
        MyClass();
        ~MyClass(){}
};
#endif //MYCLASS_H
а в cpp подключить <QtGui>:
Код
#include <QtGui>
#include "MyClass.h"

MyClass::MyClass()
{
        setLayout(new QHBoxLayout);
        layout()->addWidget(splitter = new QSplitter);
        splitter->addWidget(label = new QLabel(tr("test")));
        splitter->addWidget(buttonOk = new QPushButton(tr("&OK")));
}

2. На счет больших проектов ты ошибаешься. В больших проектах надо создавать директории, в которых надо группировать все по смыслу.

1. Это имеет значение? Все равно кнопки лишние нажимать  smile . Хотя в доках пишут, что это очень уменьшает время компилаяции проекта. Так что совет, в общем-то правельный  smile  .
2. Это я и имею ввиду. В больших проектах все надо по полочкам. Что-бы все было по местам. Даешь "правила хорошего кода"  smile !

Автор: Любитель 24.11.2007, 18:31
Цитата(archimed7592 @  20.10.2007,  11:38 Найти цитируемый пост)
Либо QHBoxLayout, либо qhboxlayout.h

Второе, вроде как, deprecated.

Цитата(nanoo @  24.10.2007,  19:12 Найти цитируемый пост)
 Это имеет значение? Все равно кнопки лишние нажимать

На времени компиляции очень сказывается.

Автор: archimed7592 24.11.2007, 23:15

M
archimed7592
Сообщения разделены в тему Precompiled headers

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)