- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在Qt程序中我实现了Pimpl方法,有3个文件
saction.cpp
saction.h
saction_p.h - with a private class sactionPrivate
该代码基于 kdelibs 中的代码。我正在使用 CMAKE 作为构建系统。所以编译的时候报错
build/moc_saction.cpp:73:22: 错误:无效使用不完整类型‘class SActionPrivate’actions/saction.h:492:18: 错误:‘类 SActionPrivate’ 的前向声明
问题出在文件moc_saction.cpp,它不包含文件saction_p.h,只包含saction.h
所以我需要在生成的 moc 文件中手动添加行:
#include "../actions/saction_p.h"
我应该怎么做,才能不手动更正 moc 文件???
CMakeLists.txt
project(scalc)
cmake_minimum_required(VERSION 2.6)
find_package(Qt4 REQUIRED)
include_directories(
${QT_INCLUDES}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/actions
)
set(scalc_SRCS
actions/saction.cpp
main.cpp )
set(CMAKE_AUTOMOC ON)
add_executable(scalc ${scalc_SRCS} )
target_link_libraries(scalc ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})
install(TARGETS scalc RUNTIME DESTINATION bin)
actions/saction.h
#ifndef SACTION_H
#define SACTION_H
#include <QtGui/QWidgetAction>
class SAction : public QWidgetAction
{
Q_OBJECT
public:
explicit SAction(QObject *parent);
virtual ~SAction();
private:
friend class SActionPrivate;
class SActionPrivate* const d;
Q_PRIVATE_SLOT(d, void slotTriggered())
};
#endif
actions/saction_p.h
#ifndef SACTION_P_H
#define SACTION_P_H
class SAction;
class SActionPrivate
{
public:
SActionPrivate():q(0)
{
}
void slotTriggered();
void init(SAction *q_ptr);
SAction *q;
};
#endif
actions/saction.cpp
#include "saction.h"
#include "saction_p.h"
#include <QtGui/QApplication>
#include <QtGui/QHBoxLayout>
#include <QtGui/QShortcutEvent>
#include <QtGui/QToolBar>
void SActionPrivate::init(SAction *q_ptr)
{
q = q_ptr;
QObject::connect(q, SIGNAL(triggered(bool)), q, SLOT(slotTriggered()));
q->setProperty("isShortcutConfigurable", true);
}
void SActionPrivate::slotTriggered()
{}
SAction::SAction(QObject *parent)
: QWidgetAction(parent), d(new SActionPrivate)
{
d->init(this);
}
SAction::~SAction()
{
delete d;
}
main.cpp
#include "saction.h"
int main(int argc, char** argv)
{
SAction gg(new QWidget());
}
由cmake moc_saction.cpp生成
#include "../actions/saction.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'kaction.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 63
#error "This file was generated using the moc from 4.8.6. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif
QT_BEGIN_MOC_NAMESPACE
static const uint qt_meta_data_SAction[] = {
// content:
6, // revision
0, // classname
0, 0, // classinfo
1, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
// slots: signature, parameters, type, tag, flags
9, 8, 8, 8, 0x08,
0 // eod
};
static const char qt_meta_stringdata_SAction[] = {
"SAction\0\0slotTriggered()\0"
};
void SAction::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
Q_ASSERT(staticMetaObject.cast(_o));
SAction *_t = static_cast<SAction *>(_o);
switch (_id) {
case 0: _t->d->slotTriggered(); break;
default: ;
}
}
Q_UNUSED(_a);
}
const QMetaObjectExtraData SAction::staticMetaObjectExtraData = {
0, qt_static_metacall
};
const QMetaObject SAction::staticMetaObject = {
{ &QWidgetAction::staticMetaObject, qt_meta_stringdata_SAction,
qt_meta_data_SAction, &staticMetaObjectExtraData }
};
#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &SAction::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION
const QMetaObject *SAction::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}
void *SAction::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_SAction))
return static_cast<void*>(const_cast< SAction*>(this));
return QWidgetAction::qt_metacast(_clname);
}
int SAction::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QWidgetAction::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
if (_id < 1)
qt_static_metacall(this, _c, _id, _a);
_id -= 1;
}
return _id;
}
QT_END_MOC_NAMESPACE
最佳答案
对了,这里有两个问题:
缺少生成 moc 的 cmake 二进制目录的包含路径
${CMAKE_CURRENT_BINARY_DIR}
您需要在相应源文件的末尾包含 moc 文件
#include "moc_saction.cpp"
关于c++ - 错误 : forward declaration of ‘class SActionPrivate’ when using PIMPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27626977/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!