2014-03-19 60 views
0

在Qt中,我有一個帶插槽的類,名爲on_pushButton_2_clicked(),在這個函數中,我想實例化另一個類,Login,並在其UI元素上運行setupUiC++和Qt,我如何運行構造函數或創建對象的不同函數來設置Ui?

目前,這是我有:

在WelcomeScreen.cpp

void WelcomeScreen::on_pushButton_2_clicked() 
{ 
    Login login(this); 
    login.init(); 
} 

和Login.cpp

void Login::init(){ 
    ui->setupUi(this); 

    QPalette wPal(palette()); 
    wPal.setColor(QPalette::Background,Qt::white); 
    ui->success->setAutoFillBackground(true); 
    ui->success->setPalette(wPal); 
    ui->success->hide(); 
    ui->failure->setAutoFillBackground(true); 
    ui->failure->setPalette(wPal); 
    ui->failure->hide(); 
} 

這編譯並運行良好,但它不按下按鈕加載登錄用戶界面。這,確實加載UI:

在WelcomeScreen.cpp

void WelcomeScreen::on_pushButton_2_clicked() 
{ 
    Ui::Login login_ui; 
    login_ui.setupUi(this); 
} 

但是,它不運行Login構造或者其任何職能,所以我不能初始化它像我想。

理想情況下,我想簡單地實例化Login對象並讓它運行構造函數,從而設置Ui並運行所有初始化。

而且,這裏的Login構造函數(它基本上是默認的構造函數)

Login::Login(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::Login) 
{ 
init(); 

} 

回答

2

在你WelcomeScreen::on_pushButton_2_clicked()功能,一旦函數結束你的Login對象將被銷燬。這是因爲它超出了範圍。您可以通過使用new或使其成爲變量來初始化它來解決此問題。您也可以使用QSharedPointer或類似的課程。

我不知道Login類應該如何工作,所以在我的示例中,我將在關閉時刪除它。

void WelcomeScreen::on_pushButton_2_clicked() 
{ 
    Login *login = new Login(this); 
    login->setAttribute(Qt::WA_DeleteOnClose); 
    login->init(); 
} 
+0

這沒有奏效......所以,如果它在函數的末尾被銷燬,使用顯式構造函數'new Login(this)'會阻止它關閉?它似乎仍然在做同樣的事情......另外,你爲什麼包含'WA_DeleteOnClose'? – JVE999

+0

@ JVE999你的'Login'類是什麼類?是否應該在自己的窗口中(即對話框)?我使用'Qt :: WA_DeleteOnClose'的原因是因爲我假設它是一個對話框。所以我想在關閉它的時候刪除它,所以我不會讓這些對象中的很多亂七八糟,因爲它們沒有被刪除,而且每次按下按鈕時都會創建一個新對象。 – thuga

+0

@ JVE999我看到它是一個主窗口。嘗試調用'login-> show();'。 – thuga

相關問題