moc 文件中缺少信号槽
Signal Slot is missing in moc file
我不能使用我连接到正确插槽的按钮。
这里是 infoPage.cpp 文件:
#include "infoPage.h"
InfoPage::InfoPage(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
bool working = false;
working = QObject::connect(ui.b_showReleaseNotes, SIGNAL(clicked()), this, SLOT(openReleaseNotes()));
working = QObject::connect(ui.ok_button, SIGNAL(clicked()), this, SLOT(closeInfoPage()));
}
void InfoPage::openReleaseNotes()
{
QString prog = "C:\Windows\System32\";
const char *args[3];
//get full path of file to use it in cmd
QString currentAppPath = QCoreApplication::applicationDirPath();
QString releaseNotePath = currentAppPath + "release_notes.txt";
args[0] = "notepad.exe";
args[1] = _strdup(releaseNotePath.toAscii());
args[2] = NULL;
prog += args[0];
//LOG_DEBUG("starting external program '%s' with file '%s'", prog.toAscii(), docPath.toAscii());
int errorCode = _spawnv(_P_NOWAIT , _strdup(prog.toAscii()),args);
if (errorCode == -1)
{
QMessageBox::information(NULL, "Error:","An error occured while starting process. The call was\n\""+prog+" "+releaseNotePath+"\"");
}
}
void InfoPage::closeInfoPage()
{
QString test = "ABC";
this->close();
return;
}
InfoPage::~InfoPage()
{
}
这里是依赖的.h文件:
#ifndef INFOPAGE_H
#define INFOPAGE_H
#include <QDialog>
#include "ui_infoPage.h"
#include <QProcess>
#include <process.h>
#include <QtDebug>
#include <QtGui/QMessageBox>
class InfoPage : public QDialog
{
Q_OBJECT
public:
InfoPage(QWidget *parent = 0);
~InfoPage();
void openReleaseNotes();
void closeInfoPage();
//private:
Ui::InfoPage ui;
private:
//void openReleaseNotes();
QString programPath;
};
#endif // INFOPAGE_H
至少,moc文件:
/****************************************************************************
** Meta object code from reading C++ file 'infoPage.h'
**
** Created: Mon 24. Jul 10:41:32 2017
** by: The Qt Meta Object Compiler version 62 (Qt 4.7.0)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/
#include "../../infoPage.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'infoPage.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 62
#error "This file was generated using the moc from 4.7.0. 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_InfoPage[] = {
// content:
5, // revision
0, // classname
0, 0, // classinfo
0, 0, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
0 // eod
};
static const char qt_meta_stringdata_InfoPage[] = {
"InfoPage[=12=]"
};
const QMetaObject InfoPage::staticMetaObject = {
{ &QDialog::staticMetaObject, qt_meta_stringdata_InfoPage,
qt_meta_data_InfoPage, 0 }
};
#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &InfoPage::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION
const QMetaObject *InfoPage::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}
void *InfoPage::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_InfoPage))
return static_cast<void*>(const_cast< InfoPage*>(this));
return QDialog::qt_metacast(_clname);
}
int InfoPage::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QDialog::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
return _id;
}
QT_END_MOC_NAMESPACE
在申请 运行 期间,我收到以下消息:
Object::connect: No such slot InfoPage::openReleaseNotes() in infoPage.cpp:8
Object::connect: (sender name: 'b_showReleaseNotes')
Object::connect: (receiver name: 'InfoPage')
Object::connect: No such slot InfoPage::closeInfoPage() in infoPage.cpp:9
Object::connect: (sender name: 'ok_button')
Object::connect: (receiver name: 'InfoPage')
我在其他线程中读到,moc 文件负责在信号和槽之间创建 "relation"。
但是moc文件不包含任何信号槽列表。我知道,它必须包含类似 qt_meta_data_InfoPage[]:
中的内容
// slots: signature, parameters, type, tag, flags
10, 9, 9, 9, 0x08,
54, 50, 9, 9, 0x08,
0 //end
如果我删除了moc文件的内容,新生成的moc文件包含相同的代码。
是否可以手动将 signal/slot 添加到 moc 文件中?
此致,
萨米尔
moc文件中缺少槽的原因是这两个方法没有声明为槽,它们被声明为简单方法:
public:
InfoPage(QWidget *parent = 0);
~InfoPage();
void openReleaseNotes();
void closeInfoPage();
相反,它们应该声明为插槽:
public:
InfoPage(QWidget *parent = 0);
~InfoPage();
public slots:
void openReleaseNotes();
void closeInfoPage();
我不能使用我连接到正确插槽的按钮。
这里是 infoPage.cpp 文件:
#include "infoPage.h"
InfoPage::InfoPage(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
bool working = false;
working = QObject::connect(ui.b_showReleaseNotes, SIGNAL(clicked()), this, SLOT(openReleaseNotes()));
working = QObject::connect(ui.ok_button, SIGNAL(clicked()), this, SLOT(closeInfoPage()));
}
void InfoPage::openReleaseNotes()
{
QString prog = "C:\Windows\System32\";
const char *args[3];
//get full path of file to use it in cmd
QString currentAppPath = QCoreApplication::applicationDirPath();
QString releaseNotePath = currentAppPath + "release_notes.txt";
args[0] = "notepad.exe";
args[1] = _strdup(releaseNotePath.toAscii());
args[2] = NULL;
prog += args[0];
//LOG_DEBUG("starting external program '%s' with file '%s'", prog.toAscii(), docPath.toAscii());
int errorCode = _spawnv(_P_NOWAIT , _strdup(prog.toAscii()),args);
if (errorCode == -1)
{
QMessageBox::information(NULL, "Error:","An error occured while starting process. The call was\n\""+prog+" "+releaseNotePath+"\"");
}
}
void InfoPage::closeInfoPage()
{
QString test = "ABC";
this->close();
return;
}
InfoPage::~InfoPage()
{
}
这里是依赖的.h文件:
#ifndef INFOPAGE_H
#define INFOPAGE_H
#include <QDialog>
#include "ui_infoPage.h"
#include <QProcess>
#include <process.h>
#include <QtDebug>
#include <QtGui/QMessageBox>
class InfoPage : public QDialog
{
Q_OBJECT
public:
InfoPage(QWidget *parent = 0);
~InfoPage();
void openReleaseNotes();
void closeInfoPage();
//private:
Ui::InfoPage ui;
private:
//void openReleaseNotes();
QString programPath;
};
#endif // INFOPAGE_H
至少,moc文件:
/****************************************************************************
** Meta object code from reading C++ file 'infoPage.h'
**
** Created: Mon 24. Jul 10:41:32 2017
** by: The Qt Meta Object Compiler version 62 (Qt 4.7.0)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/
#include "../../infoPage.h"
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'infoPage.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 62
#error "This file was generated using the moc from 4.7.0. 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_InfoPage[] = {
// content:
5, // revision
0, // classname
0, 0, // classinfo
0, 0, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
0 // eod
};
static const char qt_meta_stringdata_InfoPage[] = {
"InfoPage[=12=]"
};
const QMetaObject InfoPage::staticMetaObject = {
{ &QDialog::staticMetaObject, qt_meta_stringdata_InfoPage,
qt_meta_data_InfoPage, 0 }
};
#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &InfoPage::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION
const QMetaObject *InfoPage::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}
void *InfoPage::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_InfoPage))
return static_cast<void*>(const_cast< InfoPage*>(this));
return QDialog::qt_metacast(_clname);
}
int InfoPage::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QDialog::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
return _id;
}
QT_END_MOC_NAMESPACE
在申请 运行 期间,我收到以下消息:
Object::connect: No such slot InfoPage::openReleaseNotes() in infoPage.cpp:8
Object::connect: (sender name: 'b_showReleaseNotes')
Object::connect: (receiver name: 'InfoPage')
Object::connect: No such slot InfoPage::closeInfoPage() in infoPage.cpp:9
Object::connect: (sender name: 'ok_button')
Object::connect: (receiver name: 'InfoPage')
我在其他线程中读到,moc 文件负责在信号和槽之间创建 "relation"。
但是moc文件不包含任何信号槽列表。我知道,它必须包含类似 qt_meta_data_InfoPage[]:
中的内容 // slots: signature, parameters, type, tag, flags
10, 9, 9, 9, 0x08,
54, 50, 9, 9, 0x08,
0 //end
如果我删除了moc文件的内容,新生成的moc文件包含相同的代码。
是否可以手动将 signal/slot 添加到 moc 文件中?
此致,
萨米尔
moc文件中缺少槽的原因是这两个方法没有声明为槽,它们被声明为简单方法:
public:
InfoPage(QWidget *parent = 0);
~InfoPage();
void openReleaseNotes();
void closeInfoPage();
相反,它们应该声明为插槽:
public:
InfoPage(QWidget *parent = 0);
~InfoPage();
public slots:
void openReleaseNotes();
void closeInfoPage();