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


Автор: kirufka 2.2.2009, 02:29
Извиняюсь за сттоль глупый вопрос, но в мануалах написано не отчетливо, а книгу прочесть некогда.
На форме 3 обьекта pb-кнопка le-line edit lb-lable. Всё это в dialog.ui лежит, тоесть при компиляции получаю файл ui_dialog.h
Каким образом мне всетаки при нажатии pb текстом lb сделать содержимое le smile 
ui подключаю вот так:
Код

#include <QApplication>
#include <QDialog>
#include <QPushButton>

#include "ui_dialog.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    Ui::Dialog ui;
    QDialog *dialog = new QDialog;
    ui.setupUi(dialog);
    dialog->show();
    return app.exec();
}
  smile 

Автор: just_geek 2.2.2009, 03:10
Код

class myDialog : public QDialog, Ui::Dialog
{
Q_OBJECT
public:
    myDialog(QWidget *parent = 0) : QDialog(parent)
    {
        setupUi(this);
        connect(pb, SIGNAL(clicked()), this, SLOT(addText()));
    }
public slots:
    void addText()
    {
        lb->setText(le->text());
    }
};

myDialog my;
my.show();


как то так...

Автор: kirufka 2.2.2009, 21:39
Мммм что то у меня всё не получается щас буду сидеть дальше париться smile 
Вот что получилось, может где не правильно:?
Код

#include <QApplication>
#include <QDialog>

#include "ui_dialog.h"

class Dialog : public QDialog, Ui::Dialog
{
Q_OBJECT
public:
    Dialog(QWidget *parent = 0) : QDialog(parent)
    {
        setupUi(this);
        connect(pb, SIGNAL(clicked()), this, SLOT(addText()));
    }
public slots:
    void addText()
    {
        lb->setText(le->text());
    }
};

int main(){
     Dialog my;
     my.show();
}

вот что пишет:
Код

subjc.o: In function `main':
subjc.cpp:(.text+0x40): undefined reference to `vtable for Dialog'
subjc.cpp:(.text+0x47): undefined reference to `vtable for Dialog'
subjc.cpp:(.text+0x92): undefined reference to `vtable for Dialog'
subjc.cpp:(.text+0x99): undefined reference to `vtable for Dialog'
subjc.cpp:(.text+0xce): undefined reference to `vtable for Dialog'
subjc.o:subjc.cpp:(.text+0xd5): more undefined references to `vtable for Dialog' follow
collect2: выполнение ld завершилось с кодом возврата 1

Автор: pan2004 2.2.2009, 21:59
kirufka, в main() забыл объявить QApplication и вызвать exec().

Добавлено через 1 минуту и 13 секунд
вообще ошибки как будто отсутствует определение какой-то виртуальной функции...
Как компилируешь и собираешь, собственно?

Автор: SABROG 2.2.2009, 22:08
Что-то путаница какая-то. Наследуемся от Ui::Dialog, при этом класс обзываем Dialog... Может хотябы myDialog его сделать? Я точно не уверен, но не спутает ли компилятор конструктор Dialog с базовым конструктором Dialog, который уже без явного namespace используется в родительском классе?

Автор: kirufka 2.2.2009, 22:27
Нет тоже самое пишет. СЕйчас выложу всё....
Dialog.ui не крепится вот здесь есть http://www.sharemania.ru/0159700
Вот subjc.cpp
Код

#include <QApplication>
#include <QDialog>
#include <QPushButton>

#include "ui_dialog.h"

class myDialog : public QDialog, Ui::Dialog
{
Q_OBJECT
public:
    myDialog(QWidget *parent = 0) : QDialog(parent)
    {
        setupUi(this);
        connect(pb, SIGNAL(clicked()), this, SLOT(addText()));
    }
public slots:
    void addText()
    {
        lb->setText(le->text());
    }
};

int main() {
     myDialog my;
     my.show();
}

Компилирую так:
Код

qmake -project
qmake
make

Вот процесс:
Код

[chak@myhost subjc]$ qmake -project
[chak@myhost subjc]$ qmake
[chak@myhost subjc]$ make
g++ -Wl,-rpath,/usr/lib -o subjc subjc.o    -L/usr/lib -lQtGui -L/usr/lib -L/usr/X11R6/lib -pthread -lpng -lSM -lICE -pthread -pthread -lXi -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lfontconfig -lXext -lX11 -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread
subjc.o: In function `main':
subjc.cpp:(.text+0x40): undefined reference to `vtable for myDialog'
subjc.cpp:(.text+0x47): undefined reference to `vtable for myDialog'
subjc.cpp:(.text+0x92): undefined reference to `vtable for myDialog'
subjc.cpp:(.text+0x99): undefined reference to `vtable for myDialog'
subjc.cpp:(.text+0xce): undefined reference to `vtable for myDialog'
subjc.o:subjc.cpp:(.text+0xd5): more undefined references to `vtable for myDialog' follow
collect2: выполнение ld завершилось с кодом возврата 1
make: *** [subjc] Ошибка 1

Автор: pan2004 2.2.2009, 22:47
Цитата(kirufka @  2.2.2009,  22:27 Найти цитируемый пост)
g++ -Wl,-rpath,/usr/lib -o subjc subjc.o 

проблема судя по всему здесь, Q_OBJECT создает несколько виртуальных функций в классе, которые должны обрабатываться moc ом и потом должен получаться из них отдельный cpp и потом .o файл, подключения которого и не видно. Я уже сталкивался с таким поведением на линуксе, бага судя по всему в qmake. 
Что можно посоветовать... хз, попробуй вынести свой класс в отдельные файлы, разделив на .h и .cpp. Убери все остальные файлы, включая .pro, и сгенерируй все по новой.

Автор: kirufka 2.2.2009, 23:02
Ладно завтра буду думать что ещё тут можно замутить... Попробую как вы говорите. Я то думал что во всём виновата глобальная кривота моих рук smile PS вопрос ещё открыт, кто может помочь по последнему посту пишите....

Автор: SABROG 2.2.2009, 23:04
Цитата(pan2004 @ 2.2.2009,  22:47)
Цитата(kirufka @  2.2.2009,  22:27 Найти цитируемый пост)
g++ -Wl,-rpath,/usr/lib -o subjc subjc.o 

проблема судя по всему здесь, Q_OBJECT создает несколько виртуальных функций в классе, которые должны обрабатываться moc ом и потом должен получаться из них отдельный cpp и потом .o файл, подключения которого и не видно. Я уже сталкивался с таким поведением на линуксе, бага судя по всему в qmake. 
Что можно посоветовать... хз, попробуй вынести свой класс в отдельные файлы, разделив на .h и .cpp. Убери все остальные файлы, включая .pro, и сгенерируй все по новой.

Как раз поэтому существует техника, которая позволяет сначала запустить генератор .moc файла, прежде чем начать компиляцию. Что стоит сделать сейчас:
  • добавить эту строку в самый конец main.cpp
    Код

    #include "main.moc"
  • make clean
  • make release


Если ошибка останется, то: 
  • make clean
  • qmake
  • make release

Автор: just_geek 3.2.2009, 05:45
ну если используешь сигналы/слоты, то объявление класса ОБЯЗАТЕЛЬНо должно быть в .h файле, а имплементация в .cpp Иначе moc не будет генерировать файлик.

Автор: kuzulis 3.2.2009, 08:53
just_geek прав, нужно вынести отдельно объявление и реализацию Dialog

т.е или разбить на 2 файла *.h и *.cpp или просто все в *.h написать (если методы простые и их мало) smile

Автор: SABROG 3.2.2009, 09:07
Цитата(just_geek @  3.2.2009,  05:45 Найти цитируемый пост)
то объявление класса ОБЯЗАТЕЛЬНо должно быть в .h файле

Не обязательно, читай мой пост выше.

Автор: kuzulis 3.2.2009, 09:19
Цитата

добавить эту строку в самый конец main.cpp
Выделить всёкод C++
1:
    
#include "main.moc"


а нахрена? smile

Автор: SABROG 3.2.2009, 09:36
Цитата(kuzulis @ 3.2.2009,  09:19)
Цитата

добавить эту строку в самый конец main.cpp
Выделить всёкод C++
1:
    
#include "main.moc"


а нахрена? smile
  • Компактно
  • Меньше ручной работы
  • Для мелких программ самое то

Автор: just_geek 3.2.2009, 11:56
SABROG
хм, не знал smile Пропустил кое-чего в документации.

Автор: kirufka 3.2.2009, 12:08
Цитата(SABROG @ 2.2.2009,  23:04)
Цитата(pan2004 @ 2.2.2009,  22:47)
Цитата(kirufka @  2.2.2009,  22:27 Найти цитируемый пост)
g++ -Wl,-rpath,/usr/lib -o subjc subjc.o 

проблема судя по всему здесь, Q_OBJECT создает несколько виртуальных функций в классе, которые должны обрабатываться moc ом и потом должен получаться из них отдельный cpp и потом .o файл, подключения которого и не видно. Я уже сталкивался с таким поведением на линуксе, бага судя по всему в qmake. 
Что можно посоветовать... хз, попробуй вынести свой класс в отдельные файлы, разделив на .h и .cpp. Убери все остальные файлы, включая .pro, и сгенерируй все по новой.

Как раз поэтому существует техника, которая позволяет сначала запустить генератор .moc файла, прежде чем начать компиляцию. Что стоит сделать сейчас:


  • добавить эту строку в самый конец main.cpp
    Код

    #include "main.moc"


  • make clean

  • make release



Если ошибка останется, то: 


  • make clean

  • qmake

  • make release


И вправду добавление subjc.moc подействавало)) Всё компилится на ура)) Но только теперь при запуске того же кода получаю:
Код

[chak@myhost subjc]$ ./subjc 
QWidget: Must construct a QApplication before a QPaintDevice
Аварийный останов


Добавлено через 13 минут и 12 секунд
Хм, попытка не пытка, попробовал вот так сделать)
Код

int main( int argc, char **argv ){
    QApplication app( argc, argv );
     myDialog my;
     my.show();
}

При запуске из консоли сразу же завершается, но ошибок не выдает

Автор: pan2004 3.2.2009, 12:25
kirufka, я ж тебе писал, что ты забыл не только QApplication, но еще и вызов app.exec().
Обычно делается так в main()
QApplication app(argc, argv);
...
return app.exec();

Автор: just_geek 3.2.2009, 12:26
Код

int main( int argc, char **argv ){
    QApplication app( argc, argv );
     myDialog my;
     my.show();

     return app.exec(); // <--- ДОБАВИТЬ
}

Автор: kirufka 3.2.2009, 12:31
И вправду, спасибо большое)) помечаю как solved. Насчет первой работы с QT могу сказать порадовало, надо разобраться, думаю ничего сложного не будет)

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