【问题标题】:can't connect QT signal无法连接QT信号
【发布时间】:2010-12-16 16:48:54
【问题描述】:

我是 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:

顺便问一下,有没有调试信号的方法?
即如何确定发出信号?

【问题讨论】:

    标签: c++ qt4 signals-slots


    【解决方案1】:

    至少应该是 Q_OBJECT。我觉得你还需要继承QMainWindow。

    【讨论】:

    • 这正是问题所在。如果您的类中没有 Q_OBJECT above 插槽和信号声明,moc 将不会对这些插槽和信号进行 mocify,并且不会声明使 QObjects 反射的魔术废话(这对于 Qt 中的信号/插槽是必需的)并且不会在 moc.cpp 文件中生成。
    【解决方案2】:

    这是一个很长的镜头,但你确定调用了 onDeviceChange() 方法吗?

    编辑

    在其主体中具有 Q_OBJECT 宏的类需要直接或间接继承自 QObject,而在您的代码中并非如此。

    【讨论】:

      【解决方案3】:

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

      使用 Qt,始终监视控制台是有意义的。 Qt 会打印出各种错误消息,当您遇到问题时可以提供帮助。

      【讨论】:

        【解决方案4】:

        尝试将信号设为virtual void,并确保您的 MainWindow 类(直接或间接)继承自 QObject

        编辑

        其他cmets中提到,宏应该是Q_OBJECT

        【讨论】:

        • 虚拟性与它无关。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-15
        • 2018-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        相关资源
        最近更新 更多