Qt: подключение "нестандартных" обработчиков сигналов

Модератор: Модераторы разделов

Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Qt: подключение "нестандартных" обработчиков сигналов

Сообщение minoru-kun »

Пробую подключить к QButton в качестве сигнала обычную функцию, выводящую "Hello!" в stdin при помощи инкапсулирования в объект-потомок QObject:
myio.h:

Код: Выделить всё

#include <qapplication.h>
#include <string>
using namespace std;
class myio : public QObject
{
    public:
    void echo ();
};

myio.cpp:

Код: Выделить всё

#include <myio.h>
#include <string>
#include <qapplication.h>
#include <iostream>
using namespace std;

void myio::echo ()
{
    cout << "Hello!" << endl;
}

main.cpp:

Код: Выделить всё

#include <qapplication.h>
#include <qpushbutton.h>
#include "myio.h"
using namespace std;
int main ( int argc, char *argv[])
{
    myio io;
    QApplication app (argc,argv);
    QPushButton *button = new QPushButton ("Quit",0);
    myio::connect(button, SIGNAL(clicked()), &io, SLOT(echo()));
    app.setMainWidget(button);
    button -> show();
    return (app.exec());

}

Все прекрасно собирается, линкуется:

Код: Выделить всё

#qmake -project
#qmake qsample3.pro
make

но при запуске выдает:

Код: Выделить всё

QObject::connect: No such slot QObject::echo()
QObject::connect:  (sender name:   'unnamed')
QObject::connect:  (receiver name: 'unnamed')

Попытки нажатия на кнопку ни к чему не приводят, и очевидно, сигнал не подключен. Почему-то коннектер пытается искать слот в QObject, но "не замечает" собственных функций класса myio. Что делать? И каково "стандартное" решение этой задачи?
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Qt: подключение "нестандартных" обработчиков сигналов

Сообщение v04bvs »

class myio : public QObject
{
Q_OBJECT
public:
public slots:
void echo ();
};
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: Qt: подключение "нестандартных" обработчиков сигналов

Сообщение minoru-kun »

М, сработало.
А чем синтаксически являются объявления Q_OBJECT и public slots? ^_^
да, при объявлении как

Код: Выделить всё

void echo (string str);

и вызове как

Код: Выделить всё

SLOT(echo(str))

почему-то получаем

Код: Выделить всё

minoru@melancholic:/tmp/myio$ ./myio
QObject::connect: No such slot myio::echo(str)
QObject::connect:  (sender name:   'unnamed')
QObject::connect:  (receiver name: 'unnamed')

Возможна ли в таких случаях передача параметров? :(
Спасибо сказали:
spielmann
Сообщения: 105
ОС: Linux

Re: Qt: подключение "нестандартных" обработчиков сигналов

Сообщение spielmann »

minoru-kun писал(а):
27.07.2007 12:33
да, при объявлении как

Код: Выделить всё

void echo (string str);

и вызове как

Код: Выделить всё

SLOT(echo(str))

почему-то получаем

Код: Выделить всё

minoru@melancholic:/tmp/myio$ ./myio
QObject::connect: No such slot myio::echo(str)
QObject::connect:  (sender name:   'unnamed')
QObject::connect:  (receiver name: 'unnamed')

Возможна ли в таких случаях передача параметров? :(


minoru-kun писал(а):
27.07.2007 10:38
myio::connect(button, SIGNAL(clicked(void)), &io, SLOT(echo(void)));


Т.е. слот должен быть void func(void) в данном случае.

Передача возможна через сигнал. Если бы был sig(string s), тогда слот плучал бы параметр s автоматом.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Qt: подключение "нестандартных" обработчиков сигналов

Сообщение v04bvs »

minoru-kun писал(а):
27.07.2007 12:33
М, сработало.
А чем синтаксически являются объявления Q_OBJECT и public slots? ^_^

Честно говоря не помню, slots скорее всего в пустую строку разворачивается, а Q_OBJECT в какую нибудь гадость.
Это важно для правильного парсинга moc-ом.

да, при объявлении как

Код: Выделить всё

void echo (string str);

и вызове как

Код: Выделить всё

SLOT(echo(str))

почему-то получаем

Код: Выделить всё

minoru@melancholic:/tmp/myio$ ./myio
QObject::connect: No such slot myio::echo(str)
QObject::connect:  (sender name:   'unnamed')
QObject::connect:  (receiver name: 'unnamed')

Возможна ли в таких случаях передача параметров? :(

SLOT(echo(string))
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: Qt: подключение "нестандартных" обработчиков сигналов

Сообщение minoru-kun »

Следующая проблема: программа

Код: Выделить всё

#include <qapplication.h>
#include <qhbox.h>
#include <qslider.h>
#include <iostream>
using namespace std;

class myio : public QObject
{
    Q_OBJECT
    public:
    public slots:
    void echo (int num)
    {
        cout << "Value : " << num << endl;
    }

};
int main (int argc, char *argv[])
{
    myio *io;
    QApplication app (argc,argv);
    QHBox *hbox = new QHBox(0);
    QSlider *slider = new QSlider(Qt::Horizontal, hbox);
    slider -> setRange(0,130);
    hbox -> setCaption ("Ultimate Slider");
    hbox -> setMargin(6);
    hbox -> setSpacing(6);
    QObject::connect(slider, SIGNAL(valueChanged(int)), io, SLOT(echo(int)));
    app.setMainWidget (hbox);
    hbox -> show ();

    return (app.exec());
}

дает при запуске:

Код: Выделить всё

QObject::connect: No such slot QHBox::echo(int)
QObject::connect:  (sender name:   'unnamed')
QObject::connect:  (receiver name: 'unnamed')

Почему она ищет слот в каком-то QHBox, хотя я ей явно задал myio, - ума не приложу.
Попытка сборки с объявлением io не как указателя, и ручной передачи (&) указателя в QObject::connect, как было в первой программе, приводит к неизбежой ошибке линкера

Код: Выделить всё

hbox.cpp:(.text+0xf0): undefined reference to `vtable for myio'
hbox.cpp:(.text+0x24c): undefined reference to `vtable for myio'
hbox.cpp:(.text+0x29d): undefined reference to `vtable for myio'
collect2: ld returned 1 exit statu
.
при make. O_O

з.ы. разобрался - вариант myio io и &io стал доступен после объявления класса не в теле программы, а в отдельном хидер-файле, но тем не менее, пара myio *io и io по прежнему не работает. Проблема, хотя уже не столь остро, но остается :(
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Qt: подключение "нестандартных" обработчиков сигналов

Сообщение v04bvs »

проштудируйте документацию по сигнал-слотам. Насколько я помню, если в файле test.cpp объявляется класс, который планируется использовать в сигнал-слотах, нужно в самом конце файла (предположим test.cpp) написать
#include "moc_test.cpp"
В случае с io объявленным как указатель - я не вижу, где инициализируется этот указатель?
И вообще - если знаете С++ более-менее хорошо - не поленитесь, посмотрите исходники Qt, посмотрите автогенерируемые moc-файлы, разберитесь досконально как оно работает, там всё в пределах стандартного С++, потом больше времени сэкономите.
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux

Re: Qt: подключение "нестандартных" обработчиков сигналов

Сообщение minoru-kun »

Посмотрел на Qt4, разочаровался. Где хотя бы функция

Код: Выделить всё

QString str;
cin >> str; cout << str;

? Операторы ">>" , "<<' не значатся в списке перегруженных... И уже не говорить о том, что множество полезных функций из QString было злобно убрано.
Что, теперь вот так вот между stdin/stdout кидать?

Код: Выделить всё

int main ()
{
    QString str;
    string m_str;
    cin >> m_str;
    str = m_str.c_str();
    cout << str.toStdString();

}
Спасибо сказали: