2009-09-08 45 views
0

最近我一直在學習C++和Qt4,但是我碰到了一個絆腳石。在Qt應用程序中似乎無法識別的插槽

我有以下類和執行:

class Window : public QWidget 
{ 
public: 
    Window(); 

public slots: 
    void run(); 

private: 
    //... 
}; 

Window::Window() 
{ 
    //... 

    connect(runBtn,SIGNAL(clicked()),this,SLOT(run())); 

    //... 
} 
Window::run() 
{ 
    //... 
} 

然而,當我試圖建立並運行它,但它建立得很好,它立即退出了與消息

Object::connect: No such slot QWidget::run() 

除非我做錯了,Qt似乎並沒有被識別nizing插槽run()

誰能請幫助?


更新:

的代碼是現在:

class Window : public QWidget 
{ 
    Q_OBJECT 
public: 
    Window(QWidget *parent = 0); 

public slots: 
    void run(); 

private: 
    //... 
}; 

Window::Window(QWidget *parent) : QWidget(parent) 
{ 
    //... 

    connect(runBtn,SIGNAL(clicked()),this,SLOT(run())); 

    //... 
} 
Window::run() 
{ 
    //... 
} 

程序還是 「意外結束」,但不再告訴我,有是沒有這樣的事情QWidget::run()

+0

這段代碼*直*從您的實際代碼copypaste?如果你的run()插槽有參數,但你沒有在SLOT宏中定義,通常會發生你描述的錯誤。也就是說,在運行時出現相同的錯誤,而不是崩潰。此外,你也應該打電話給父母的構造函數。 – rasjani 2009-09-08 20:33:53

+0

我們不能告訴你爲什麼它會從你粘貼的代碼崩潰。在你編寫但未顯示的其他代碼中可能存在一個錯誤。 – rohanpm 2009-09-09 01:01:38

+0

「公共插槽:」,這是如何工作的?從來沒有見過這種語法 – 2009-09-09 07:30:32

回答

8

可能您忘記了Window類中的Q_OBJECT宏?

class Window : public QWidget 
{ 
Q_OBJECT 
public: 
    Window() 
... 
+0

顯然,是的。但是,我添加它後,它仍然立即崩潰,並退出代碼0. – 2009-09-08 16:47:36

+0

@奧斯汀,不要忘記這樣做後重新運行qmake,因爲它需要將您的文件添加到要運行的項目列表MOC,這也會影響運行時的行爲。 – 2009-09-08 17:18:21

+0

你有堆棧跟蹤嗎?無論如何,我推薦閱讀Qt教程,這是Qt文檔的一部分。他們寫得很好,一步一步來。另外還有很多使用最常見的類的例子,值得一看。 – hirschhornsalz 2009-09-08 17:19:15

1

什麼是runBtn,它是如何創建的?如果它是作爲ui文件的一部分創建的,你打電話給setupUi()?你的窗口類是如何創建的?你似乎已經省略了一些代碼(// ...),這可能是錯誤的地方。

我可以給你的最好的建議,試圖減少你的問題,以一個非常小的可編譯的例子。這有助於有兩個原因:

  1. 它可以幫助你診斷的問題,因爲會更少的代碼來看看。
  2. 如果您仍需要我們的幫助,它會幫助我們因爲我們將有一個完整的代碼庫,我們可以下載,編譯和調試。通常問題不在你認爲的地方。

希望這會有所幫助。

0

看起來runBtn在調用connect時沒有被實例化 - 正如其他答案之一所暗示的那樣。

使用斷點來檢查崩潰發生的位置。

2

那麼我也有這個問題,並且可能在網上找不到任何幫助。我發現我忘記在重新編譯之前刪除moc_ *文件,它使用舊的moc文件來創建可執行文件。這導致它不知道我編碼的任何新插槽。如果所有其他建議都失敗了,我會檢查一下。

有時最簡單的解決方案是最好的解決方案...

相關問題