This question already has answers here:
Slot seemingly not recognized in Qt app [duplicate]
                                
                                    (4个答案)
                                
                        
                                5年前关闭。
            
                    
我有一个具有插槽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();
}

最佳答案

SdiWindow需要将Q_OBJECT宏作为其第一行。

class SdiWindow : public QMainWindow
{
Q_OBJECT
public: ....


您还必须在头文件上使用moc。 moc工具为信号和插槽框架生成所有必需的C ++代码。

生成的Moc代码必须经过编译,并且链接器知道。我这样做是通过将生成的文件包含在我的实现文件中来实现的

#include SdiWindow.h
#include SdiWindow.moc


drescherjm还建议仅对其进行编译。

编辑:在这种情况下,您将从QMainWindow继承,以供将来参考,您的类将需要以某种方式从QObject继承,以便能够使用信号/插槽框架。

关于c++ - Qt没有找到广告位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24212823/

10-15 03:34