2012-08-08 63 views
2

我在正在編寫的程序中連接時出現問題。我首先創建一個「主窗口」對話框,其中包含按鈕,線條編輯等(這些對我的自定義插槽都完美無缺)。其中一個按鈕(「添加類」按鈕)應該創建一個新的彈出對話框,它是mainWindow對話框的子對話框。我爲這個新對話框(addClass.h和addClass.cpp)寫了一個新的.h和.cpp文件。當我點擊按鈕時,對話框模式被設置爲ApplicationModal,並且直到這一點,代碼才起作用;當我點擊「添加類」時,新對話框顯示爲彈出窗口,包含我想要的所有標籤,線條編輯和按鈕。當我嘗試使用這個新類的連接時,問題就出現了。點擊確定按鈕後,連接不會被執行。程序編譯正確(使用qmake然後make)並且在運行時不會出錯。我還從彈出的對話框中取出了.h和.cpp文件,並用自己的main.cpp測試了它們,並且連接完美無缺。我很難將問題解決,所以任何幫助都會很棒!使用QDialog作爲彈出窗口時連接無法正常工作

這裏是代碼,可能會有所幫助一些snipets:

發起在mainWindow.cpp彈出對話框(作品和我有「addClass.h」在mainWindow.cpp)自定義插槽:

void mainWindow::addClassCombo(){ 
    addClass aC(win); 
} 

addClass.h:

#ifndef ADDCLASS_H 
#define ADDCLASS_H 

#include <QDialog> 
#include <QHBoxLayout> 
#include <QVBoxLayout> 
#include <QLabel> 
#include <QLineEdit> 
#include <QPushButton> 
#include <QString> 

class addClass : public QDialog{ 

    Q_OBJECT 

public: 
    addClass(QWidget *parent = 0); 

private slots: 
    void addToTxt(); 

private: 
    QDialog *addMathClass; 
    QVBoxLayout *mainLayout; 
    QHBoxLayout *layoutOkCanc; 
    QLabel *nameL;   //label for name of math class to be added 
    QLineEdit *name;  //line edit for name 
    QPushButton *ok;  //ok button 
    QPushButton *canc;  //cancel button 
}; 

#endif 

addClass.cpp(作品有自己的main.cpp而不是一個與我mainWindow.cpp):

#include <QtGui> 
#include <QTextStream> 

#include "addClass.h" 

#include <iostream> 

addClass::addClass(QWidget *parent):QDialog(parent){ 

    addMathClass = new QDialog(parent); 

    mainLayout = new QVBoxLayout(addMathClass); 
    layoutOkCanc = new QHBoxLayout(); 

    nameL = new QLabel("Math Class Name:"); 
    name = new QLineEdit; 
    nameL->setBuddy(name); 

    ok = new QPushButton("Ok"); 
    canc = new QPushButton("Cancel"); 

    QObject::connect(canc, SIGNAL(clicked()), addMathClass, SLOT(close())); //<-works 
    QObject::connect(ok, SIGNAL(clicked()), this, SLOT(addToTxt()));  //<-doesn't work 
    QObject::connect(ok, SIGNAL(clicked()), addMathClass, SLOT(close())); //<-works 

    layoutOkCanc->addStretch(); 
    layoutOkCanc->addWidget(ok); 
    layoutOkCanc->addWidget(canc); 

    mainLayout->addWidget(nameL); 
    mainLayout->addWidget(name); 
    mainLayout->addLayout(layoutOkCanc); 

    addMathClass->setWindowModality(Qt::ApplicationModal); 
    addMathClass->setWindowTitle("Add Class"); 
    addMathClass->show(); 
} 

void addClass::addToTxt(){ 
    std::cout<<"testing"<<std::endl; 
} 

回答

1

您的addClass aC(win);超出範圍並被銷燬。連接工作,但在對象破壞被斷開之後。這就是爲什麼你沒有得到插槽叫

+1

太棒了!這解決了它!非常感謝! – synthrom 2012-08-09 13:23:58

相關問題