2010-12-16 89 views
1

我是QT新手,试图创建一个自定义信号,告诉我一个可移动磁盘已被插入。 这是我做过什么无法连接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:

顺便问一下,有什么方法可以调试信号?
即我如何确保发出信号?

回答

2

由于连接问题,请务必检查控制台是否有关于连接失败的消息。由于Qt直到运行时才能确定连接是否有意义,它会通知您那里出现故障。你会认为它会崩溃,但它只是在控制台中悄悄地说这些东西。

有了Qt,看看控制台总是有意义的。 Qt会打印出各种错误信息,这些错误信息可以在出现问题时提供帮助。

0

尝试使你的信号virtual void代替,并确保您的主窗口类从QObject

编辑

正如在其他评论中提到继承(直接或间接),宏应该是Q_OBJECT

+1

虚拟性与它无关。 – 2010-12-16 17:53:01

3

这是一个远射,但你确定onDeviceChange()方法被调用?

编辑

类具有Q_OBJECT宏在自己的身体需要直接或间接地从QObject的继承,并在你的代码是不是这样的。

6

它至少应该是Q_OBJECT。我想你也需要继承QMainWindow。

+0

这正是问题所在。如果没有Q_OBJECT *上面的* slot和信号声明,你的类中的moc将不会使这些插槽和信号变得混乱,而使QObjects反射(这对于Qt中的信号/插槽是必需的)的魔咒将不会被声明并且不会被生成在moc.cpp文件中。 – 2010-12-16 17:51:49

+0

以上只是一个输入错误。我也有Q_OBJECT – 2010-12-18 07:24:18