2011-07-18 97 views
4

問題在於,每次從我的主窗口啓動「設置」窗口時,我都會在Qt Creator中不斷收到'No Slot'運行時錯誤。我發現Qt到目前爲止是非常直觀的,而且這個插槽的信號概念似乎只是簡單地傳遞變量或函數調用而已。基本上,我有一個設置選項的菜單,單擊時,打開一個設置窗口,需要從用戶中獲取一個雙精度,並在主窗口中更新一個var。QT:沒有這樣的插槽

SettingsWindow.h

class SettingsWindow : public QWidget 
{ 
     Q_OBJECT 
    public: 
     SettingsWindow(QWidget *parent = 0); 
    signals: 
     void ValChanged(double newVal); 
    public slots: 
     void Accept(); 
    private: 
     QLineEdit *le1; 
}; 

設置窗口具有的newval設置爲作爲雙LE1中用戶輸入發射的ValChanged信號接受按鈕它調用接受()。

SettingsWindow.cpp

void SettingsWindow::Accept(){ 
    emit ValChanged(le1->text().toDouble()); 
    this->close(); 
} 

該設置窗口由應用程序的主窗口調用:主窗口

MainWindow.cpp

class MainWindow : public QMainWindow 
{ 
     Q_OBJECT 
    public: 
     MainWindow(QWidget *parent = 0); 
    public slots: 
     void SetVal(double x); 
    private slots: 
     void NewWindow(); 
    private: 
     double theVal; 
}; 

該主窗口的菜單哪一個會選擇設置。這將創建一個新的窗口,其中一個字段用於輸入一個數字。

MainWindow.cpp

void MainWindow::NewWindow() 
{ 
    SettingsWindow *MySettings=new SettingsWindow(this); 
    QObject::connect(MySettings, SIGNAL(ValChanged(double)), this, SLOT(SetVal(double))); 
    MySettings->show(); 
    MySettings->raise(); 
} 

void MainWindow::SetVal(double x){ 
    theVal = x; 
} 

我希望打開的設置窗口時,用戶可以輸入一個VAL到現場,然後發出信號ValChanged這臺theVal由用戶指定的值。大多數時候我看到一個問題,不包括Q_OBJECT宏的人,但我已經包括它兩次。有關爲什麼這不起作用的任何建議?

+0

你是moc文件好嗎?你可以在'qt_metacall(QMetaObject :: Call _c,int _id,void ** _ a)'中看到你的插槽嗎? – vrince

+0

是的,它在那裏。它應該全部被定義。 – user850275

+0

有幾個問題需要澄清。哪個插槽在錯誤信息中命名爲「No such slot」?如何調用「接受」插槽? –

回答

3

您遇到的問題幾乎肯定是由於moc文件未被重新創建,連接調用中的拼寫錯誤或有關插槽聲明中的拼寫錯誤。

您可能想要考慮這是從對話框中獲取輸入所需的大量工作。更簡單的方法是將「接受」按鈕單擊的信號連接到主窗口中的插槽,然後通過getXXX()方法直接從設置窗口的實例中獲取所需的值。

如果你最終有一個設置對話框有很多值,而不是通過getters獲取每個值,讓「接受」按鈕信號返回一個結構,所有的值都作爲該結構的字段。

我應該提到它看起來像NewWindow()每次調用時都會創建一個新的SettingsWindow實例。所有這些實例都會一直存在,直到MainWindow被銷燬。

+0

嗯,我會考慮這個。我希望有人會在教程中發表或者一路上發表的。我也很清楚,直到MainWindow的析構函數被打開的實例,這只是一個概念證明。 – user850275

+0

我可以理解你的挫敗感,特別是如果你之前沒有使用過窗口框架。這是一個需要熟悉的龐大的圖書館。 Qt是最好的文檔庫之一,您將找到豐富的示例和演示。不幸的是,其中大多數都針對單個項目,缺乏全面的,最佳實踐「應用」示例。有時你會發現其中一個演示或例子會產生有價值的信息作爲副作用。這裏的Qt程序員非常友好和樂於助人,所以不斷提出問題。 –

+0

非常感謝您的幫助!我決定使用你描述的方法來設置一個getter來完成這項工作,而且它現在似乎正在工作。考慮解決這個問題。 – user850275

7

對我來說,在我的插槽功能上面增加一個public Q_SLOTS:就是我所缺少的。 (我已經有Q_OBJECT等)

+1

請指定。我不清楚你到底做了什麼。 – dhein

0

我錯誤地試圖通過一個參數到我的插槽沒有QSignalMapper,我從this SO帖子瞭解到。

刪除插槽函數(.h和.cpp)的所有參數允許找到並調用回調函數。

是的,我是Qt n00b。時間與QSignalMapper重構:)

HTH

1

我解決我的問題,當我手動重新創建在命令行上我的MOC文件。

我使用QT命令提示符選項,這樣所有的路已經設置:

cd /path/to/my/project 
moc -o moc_myheaderfile.cpp myheaderfile.h 

沒有什麼錯我的代碼,我的生成文件沒有任何MOC命令,我可以看到。這適用於我嘗試過的所有示例。我希望有人也可以試試這個。在我找到原因之前,我進行了近85個小時的實驗。

對於codeblocks用戶,請嘗試重新創建您的moc文件。 -o myheaderfile.cpp選項是將moc輸出保存到文件。 在文件上運行moc實際上會將所有內容都噴到控制檯窗口上。

相關問題