日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

qt 对话框关闭以及自动释放内存

發(fā)布時間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt 对话框关闭以及自动释放内存 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
關于窗口關閉的操作,在這里指出常用的三個槽,即quit(),exit()以及close()。
首先說明窗口退出時,系統(tǒng)提示對話框的代碼編輯。對主程序的退出,可以調(diào)用成員函數(shù)exit(),同時也可以調(diào)用槽quit(),二者此時都能起到關閉應用程序的作用。
只是應注意二者調(diào)用的方式不同。如下程序示例:
{
?QApplication* app;
?app->exit(0);
}
或者:
{
?QApplication* app;
?app->quit();
}
注意 通過設置QWidget::setAttribute(Qt::WA_DeleteOnClose),在關閉對話框(手動close獲取esc closeEvent)的時候會自動調(diào)用析構函數(shù) 此時二者是等價的,即void QApplication::quit ()等價于函數(shù)調(diào)用 QApplication::exit( 0 )。
此時,若需要給出用戶提示,則只需要在程序當中添加QMessageBox的消息判斷語句,以提示用戶是否確定退出應用程序。
另外,quit()作為槽,也可以連接信號和槽的形式,響應某個信號后關閉應用程序。如:
QPushButton *quitButton = new QPushButton( "Quit" );
connect( quitButton, SIGNAL(clicked()), qApp, SLOT(quit()) );
如果關閉的不是應用程序,而是關閉窗口等部件的形式,則必須調(diào)用close()函數(shù),已關閉部件。如下:
if (!(QMessageBox::information(this,tr("CT Control View"),tr("Do you really want to log out CT Control View?"),tr("Yes"),tr("No"))))
{
?this->close();
}
其中通過一條if語句,判斷條件為一個對話框,根據(jù)用戶的選擇做出是否關閉該部件,this在這里代表當前窗口部件對象的地址。當用戶選擇“Yes”時,該窗口部件退出;反之則取消退出操作。 至此,我們已經(jīng)簡單了解了應用程序和窗口等部件的退出或關閉的代碼編輯。然而,如果用戶點擊窗口右上角的X按鍵時,你會發(fā)現(xiàn)窗口仍然會在不給出任何提示的情況下直接退出了,即便你在程序當中已添加了提示的對話框語句。
那為什么此時的關閉操作沒有按我們希望的那樣先給出提示對話框呢?原因是此時的關閉操作并沒有引起調(diào)用帶有提示消息的關閉或退出語句。
當用戶點擊X關閉窗口時,系統(tǒng)會自動將這個事件告之某個特定的函數(shù),即void QWidget::closeEvent ( QCloseEvent?*?e ),因此,這種情況應特別注意。
在關閉窗口前,可先定義一條消息語句,以提示用戶是否確定關閉窗口。如:
void mainWindow::closeEvent( QCloseEvent * event )
{
??? switch( QMessageBox::information( this, tr("CT Control View"),
?????tr("Do you really want to log out CT Control View?"),
?????tr("Yes"), tr("No"),0, 1 ) )
??{
???? case 0:
???event->accept();
???????? break;
???? case 1:
??default:
???????? event->ignore();
???????? break;
??}??
}
編譯程序后,系統(tǒng)會在用戶響應close操作時,自動調(diào)用該語句。也許這個時候你還會問,上面的那個功能函數(shù)究竟是把它定義成槽呢,還是定義成成員函數(shù)。答案是二者都可以。
一方面槽本身就是一個特殊的成員函數(shù),除了能與信號連接之外,其功能與函數(shù)無異。另一方面,此時不需要額外設置連接信號和槽,添加該功能函數(shù)之后,窗口一旦有了close操作,機會立即響應該。 盡管添加closeEvent( QCloseEvent * event )這一功能函數(shù)之后,窗口會在關閉時給出提示對話框。但有時候還會發(fā)生這樣一種情況:在點擊確認關閉后,還會再會出現(xiàn)一個對話框,即提示對話框會出現(xiàn)兩次。那這又是什么原因呢?其實很簡單,那是因為closeEvent( QCloseEvent * event )只會響應close的操作,出現(xiàn)兩次對話框無疑是在自定義的關閉函數(shù)中又添加一條提示對話框語句,確認關閉后,響應close操作,這時系統(tǒng)又會馬上調(diào)用closeEvent( QCloseEvent * event )這個函數(shù)。
因此,解決的辦法是只定義一個帶提示對話框的關閉函數(shù),對不同的關閉操作都相應closeEvent( QCloseEvent * event )這個函數(shù)即可。 最后,如果想要在關閉主窗口或主程序時,所有打開的獨立的子窗口都能同時被關閉。那么這個時候一般是在main.cpp文件中連接信號void QApplication::lastWindowClosed ();關于lastWindowClosed()的詳細介紹,這里不作說明,需要使用時可以使用Qt Assistant查看其使用發(fā)法。如:
int main( int argc, char ** argv )
{
??? QApplication a( argc, argv );
??? ABMainWindow *mw = new ABMainWindow();
??? mw->setCaption( "Qt Example - Addressbook" );
??? a.setMainWidget( mw );
??? mw->show();
??? a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
??? int result = a.exec();
??? delete mw;
??? return result;
}
這樣,系統(tǒng)會在關閉主窗口部件時,同時關閉打開的其它子窗口程序。比較值得說明的是,并不是使用了a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) )這條語句后就一定能實現(xiàn)該功能。在此之前,必須特別注意是否設定了主窗口部件,即調(diào)用setMainWidget這一功能函數(shù),這樣,當關閉這一主窗口部件時,才會響應關閉這一時刻已打開的其它子窗口部件。

總結

以上是生活随笔為你收集整理的qt 对话框关闭以及自动释放内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。