我最近开始用C++编程,在类之间的数据交换方面遇到了一些困难。我搜索了许多教程和示例,但都不起作用。我最终决定寻求帮助,因为我不知道该做什么。。。
PS:我想从我的B(solEditor)类调用keyPressEvent函数
谢谢。
插件/soleditor.h(类)
#include <Qsci/qsciscintilla.h>
#include <QWidget>
#include <QKeyEvent>
class Editor; // main class
class solEditor : public QsciScintilla
{
public:
explicit solEditor(QWidget *parent = 0);
Editor editor; // error <<
protected:
void keyPressEvent(QKeyEvent *e);
};
编辑器.h(主窗口)
#include <QMainWindow>
#include "about.h"
#include "data.h"
#include "addons/codeeditor.h"
#include "addons/highlighter.h"
#include "addons/soleditor.h"
#include "plugins/headergenerator.h"
#include "plugins/updatescreen.h"
namespace Ui {
class Editor;
}
class solEditor;
class Editor : public QMainWindow
{
Q_OBJECT
solEditor *sE;
public:
QsciScintilla* ce;
Highlighter *Hl;
solEditor *e;
Ui::Editor *ui;
explicit Editor(QWidget *parent = 0);
~Editor();
public slots:
void on_KeyPress(QKeyEvent *e);
};
错误:
SOLEditor\addons\SOLEditor.h:14:错误:C2079:"SOLEditor::editor"使用未定义的类"editor"
您使用的是正向声明
class Editor; // main class
具有该类的本地实例
Editor editor; // error <<
不幸的是,这是不可能的,因为在这种情况下,编译器需要知道Editor
类的全部细节。有两种可能的解决方案:
- 使成员成为指针:
Editor* editor
- 使用
#include
而不是正向声明
如果你想让你的代码变得灵活,你可以这样做:
class solEditor : public QsciScintilla
{
public:
explicit solEditor(Editor* editor, QWidget* parent = 0);
inline Editor* editor() const { return _editor; }
private:
Editor* _editor;
}
和在cpp文件中:
solEditor::solEditor(Editor* editor, QWidget* parent)
// TODO: call parent constructor
{
_editor = editor;
}
solEditor::~solEditor()
{
_editor = NULL;
}
然后,您可以创建一个solEditor
实例,如下所示:
QWidget* optionalParentWidget = GetParentWidgetFromSomewhere();
Editor* editor = GetEditorInstanceFromSomewhere(); // or create it yourself
solEditor* myEditor = new solEditor(editor, optionalParentWidget);
(作为一个侧节点,C++中的类通常以大写字母QWidget, Editor, SolEditor
开头。这使得更容易发现某个东西是类、函数还是变量)。
关于按键事件:如果你想让一个类处理另一个类的某些事件,最好使用eventFilter
机制:
http://qt-project.org/doc/qt-5/qobject.html#installEventFilter