我有一个基本窗口,其中有一个插槽fileNew()
。当我运行我的应用程序时,我收到以下错误:
QObject :: connect:没有这样的插槽QMainWindow :: fileNew()
为什么找不到插槽?
SdiWindow.h
class SdiWindow : public QMainWindow
{
public:
SdiWindow(QWidget * parent = 0);
private slots:
void fileNew();
private:
QTextEdit * docWidget;
QAction * newAction;
void createActions();
void createMenus();
};
SdiWindow.cpp
SdiWindow::SdiWindow(QWidget * parent) : QMainWindow(parent)
{
setAttribute(Qt::WA_DeleteOnClose);
setWindowTitle( QString("%1[*] - %2").arg("unnamed").arg("SDI") );
docWidget = new QTextEdit(this);
setCentralWidget(docWidget);
connect(
docWidget->document(), SIGNAL(modificationChanged(bool)),
this, SLOT(setWindowModified(bool))
);
createActions();
createMenus();
statusBar()->showMessage("Done");
}
void SdiWindow::createActions()
{
newAction = new QAction( QIcon(":/images/new.png"), tr("&New"), this );
newAction->setShortcut( tr("Ctrl+N") );
newAction->setStatusTip( tr("Create a new document") );
connect(newAction, SIGNAL(triggered()), this, SLOT(fileNew()));
}
void SdiWindow::createMenus()
{
QMenu * menu = menuBar()->addMenu( tr("&File") );
menu->addAction(newAction);
}
void SdiWindow::fileNew()
{
(new SdiWindow())->show();
}
答案 0 :(得分:2)
SdiWindow需要将Q_OBJECT宏作为其第一行。
class SdiWindow : public QMainWindow
{
Q_OBJECT
public: ....
您还必须在头文件中使用 moc 。 moc工具为信号和插槽框架生成所有必需的C ++代码。
必须编译生成的moc代码并使链接器知道。我通过将生成的文件包含在我的实现文件中来完成此操作
#include SdiWindow.h
#include SdiWindow.moc
drescherjm也建议自己编译它。
编辑:在这种情况下,你继承自QMainWindow,为了将来的参考,你的类需要以某种方式从QObject继承才能使用信号/插槽框架。