【发布时间】:2017-08-08 00:37:35
【问题描述】:
我正在尝试继承 QQueue 以添加一些功能。
实际上,我无法进行子类化,但因为代码很短,我重写了自己的实现:
#ifndef MYQUEUE_H
#define MYQUEUE_H
#include <QObject>
#include <QtCore/qlist.h>
QT_BEGIN_NAMESPACE
template <class T>
class MyQueue : public QList<T>
{
Q_OBJECT
public:
// compiler-generated special member functions are fine!
inline void swap(MyQueue<T> &other) Q_DECL_NOTHROW { QList<T>::swap(other); } // prevent QList<->QQueue swaps
#ifndef Q_QDOC
// bring in QList::swap(int, int). We cannot say using QList<T>::swap,
// because we don't want to make swap(QList&) available.
inline void swap(int i, int j) { QList<T>::swap(i, j); }
#endif
inline void enqueue(const T &t) { QList<T>::append(t); emit enqueued(); }
inline T dequeue() { return QList<T>::takeFirst(); }
inline T &head() { return QList<T>::first(); }
inline const T &head() const { return QList<T>::first(); }
signals:
void enqueued();
};
QT_END_NAMESPACE
#endif // MYQUEUE_H
基本上,只要有东西入队,它就会发出一个信号。 我不知道将该信号绑定到插槽的正确语法:
MyQueue<QString> queue;
connect(&queue, &MyQueue::enqueued, this, &MainWindow::process_queue);
错误:“模板类 MyQueue”未使用模板参数 连接(&queue, &MyQueue::enqueued, 这个, &MainWindow::process_queue); ^
它说我正在使用MyQueue(即模板类)而没有指定模板参数(QString)。
我试图添加它,但我做错了:
connect(&queue, &MyQueue<QString>::enqueued, this, &MainWindow::process_queue);
错误:没有匹配函数调用 'MainWindow::connect(MyQueue, void (MyQueue::)(), MainWindow*, void (MainWindow::*)())'
连接此类信号的正确语法是什么?
【问题讨论】:
-
我认为你的方法行不通。除了模板类,如果你想使用信号/槽,你必须将它们与
QObjects 或其子类一起使用。 -
为什么
MyQueue不能继承非模板基类,把需要的signal放到基类中? -
您的意思是一种添加所需信号的包装器吗?这可能是一个可以接受的解决方法。