没有收到Qt发出的信号

时间:2014-12-02 12:15:56

标签: c++ qt

我无法在假定的SLOT中收到自定义信号。这是我的代码:

mainwindow.h

class HistoryItem {
    public:
        QString channel;
};


class dbThread : public QObject
{
     Q_OBJECT

public:
     dbThread();

signals:

void historyLoaded(QList<HistoryItem*> innerResult);


class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void historyLoaded(const QList<HistoryItem*> innerResult);

mainwindow.cpp

connect(dbtrad, SIGNAL(historyLoaded(QList<HistoryItem*>*)), this, SLOT(historyLoaded(QList<HistoryItem*>*)));

void MainWindow::historyLoaded(QList<HistoryItem*> innerResult) {
    qDebug() << "historyLoaded()...";
}

这就是我发出信号的方式:

QList<HistoryItem*> innerResult;
while (queryInner.next()) {
    QString channelIDInner = queryInner.value(0).toString();

    HistoryItem* item = new HistoryItem();
    item->channel = channelIDInner;

    innerResult.append(item);
}
qDebug() << "DONE LOADING.....";
emit historyLoaded(innerResult);

但是,永远不会执行qDebug() << "historyLoaded()...";

任何想法可能是什么问题?

2 个答案:

答案 0 :(得分:3)

看来你正在使用线程。在跨线程发信号时(或一般使用QList)使用Qt::QueuedConnection需要一些额外的工作。基本上,您需要使用QList<T>定义typedef类型,然后使用qRegisterMetaType进行注册:

typedef QList<HistoryItem*> HistoryList_t;
...
qRegisterMetaType<HistoryList_t>("HistoryList_t");

然后在信号和插槽中使用此类型:

public slots:
    void historyLoaded(const HistoryList_t &list);

答案 1 :(得分:1)

检查connect的返回值,它应该失败。 *中有一个额外的SIGNAL(historyLoaded(QList<HistoryItem*>*)),应为SIGNAL(historyLoaded(QList<HistoryItem*>))。修复您的SLOT()