не удается подключить сигнал QT - PullRequest
1 голос
/ 16 декабря 2010

Я новичок в QT и пытался создать собственный сигнал, который сказал бы, что вставлен съемный диск. Это то, что я сделал

MainWindow.h

class MainWindow
{   
    QOBJECT
    ..
    ..
    signals:
    void qm_diskInserted(QString &);
    public slots:
    void addItemToList(QString &);
    ...
}

MainWindow.cpp

void MainWindow::onDeviceChange(MSG * msg)
{
   //code for detecting device here
   QString &driveLetter= getDriveLetter(mask);
   //try to emit QT signal here
   emit qm_diskInserted(driveLetter);
}
MainWindow::MainWindow(QWidget * parent=NULL)
{
   ui.setupUi(this);
   QObject::connect(this, SIGNAL(qm_diskInserted(QString&)), this, SLOT(addItemToList(QString &));
}
void MainWindow::addItemToList(QString &)
{
   //more stuff here
}

как-то слот addItemToList () не вызывается, и я должен вызвать его вручную.
Что я делаю не так?

Спасибо.PS:

Кстати, есть ли способ отладки сигналов?
Т.е. как я могу быть уверен, что сигнал излучается?

Ответы [ 4 ]

6 голосов
/ 16 декабря 2010

По крайней мере предполагается, что это Q_OBJECT.Я думаю, что вам также нужно наследовать QMainWindow.

3 голосов
/ 16 декабря 2010

Это длинный выстрел, но вы уверены, что метод onDeviceChange () вызывается?

EDIT

Классы, имеющие в своем теле макрос Q_OBJECT, должны прямо или косвенно наследоваться от QObject,и в вашем коде это не так.

2 голосов
/ 16 декабря 2010

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

С Qt имеет смысл всегда смотреть консоль. Qt распечатывает всевозможные сообщения об ошибках, которые могут помочь при возникновении проблемы.

0 голосов
/ 16 декабря 2010

Попробуйте вместо этого сделать ваши сигналы virtual void и убедитесь, что ваш класс MainWindow наследует (прямо или косвенно) от QObject

EDIT

Как упоминалось в других комментариях, макрос должен быть Q_OBJECT

...