我无法在假定的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()...";
。
任何想法可能是什么问题?
答案 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()
。