c++ - 对异步运行并发出信号的命令使用撤消堆栈
问题描述
我有一个继承自的命令QUndoCommand
:
class ImportEntityCommand : public QUndoCommand
{
// ...
private:
QString m_importedEntityName;
Importer *m_importer;
// ...
}
该redo
方法启动一个 QProcess:
void ImportEntityCommand::redo()
{
if (/* Import is already done before */) {
// ...
} else {
// Import finish is handled by a slot
m_importer->import(m_url);
}
}
信号槽连接由命令构造函数组成:
ImportEntityCommand::ImportEntityCommand(EditorSceneItemModel *sceneModel, const QUrl &url) :
, m_importer(new Importer(/* ... */))
{
// Importer would start a QProcess which runs asynchronously and emits a signal
// that's why I have to handle the signal by a slot
QObject::connect(m_importer
, &Importer::importFinished
, this
, &ImportEntityCommand::handleImportFinish
);
}
进程发出的信号是这样处理的:
void ImportEntityCommand::handleImportFinish(const QString name)
{
m_importedEntityName = name;
}
但是我在编译时收到这样的错误:
C:\Qt\Qt5.12.9\5.12.9\msvc2017_64\include\QtCore\qobject.h:250: 错误:C2664: 'QMetaObject::Connection QObject::connectImpl(const QObject *,void **,const QObject * ,void **,QtPrivate::QSlotObjectBase *,Qt::ConnectionType,const int *,const QMetaObject *)':无法将参数 3 从 'const ImportEntityCommand *' 转换为 'const QObject *'
错误点是:
无法将参数 3 从“const ImportEntityCommand *”转换为“const QObject *”
我想我继承了我的ImportEntityCommand
类,QUndoCommand
而我的类又继承自QObject
。
问题
因此,出于某种原因,Qt 不允许我处理继承自QUndoCommand
.
- 这个限制是故意的吗?
- 我有哪些选项可以解决此限制?标准程序是什么?
解决方案
我从 QUndoCommand 继承了我的 ImportEntityCommand 类,我猜它又从 QObject 继承。
QUndoCommand 不继承自 QObject 参见:
https://doc.qt.io/qt-5/qundocommand.html
例如,与 QWidget 相比,它确实继承自 QObject。
https://doc.qt.io/qt-5/qwidget.html
如果你想让你的导入器处理信号和槽,你可以从 QObject 继承:
class importer: public QObject
{
Q_OBJECT
public:
...
private:
...
}
您可以连接到 lambda,例如:
QObject::connect(m_importer
, &Importer::importFinished
[&]() { this->handleImportFinish() }
);
推荐阅读
- java - 如何使用 Selenium 放心地调用体内的函数
- search - 二叉搜索树找到给定键的后继(键不必在树中)
- go - 填充作为指针传递给函数的结构数组
- jmeter - 使用 jmeter 进行 API 测试
- node.js - 如何将 upsert 参数与 feathershjs 一起使用
- php - 在 t1 中插入新书,并将 T2 中的现有作者添加到本书中
- android - error al iniciar ionic /// @ionic/app-scripts : 未安装
- c# - 为什么 ASP.NET Core 的 Startup 类不是接口或抽象类?
- fiware - Fiware Orion CB 获取某个类型的实体
- java - 使用 Scanner 读取文本文件并存储到 ArrayList