Qt与VS的对比(1)

对话框篇:

QT与VS创建对话框的方式非常相似,都需要创建一个对话框类,在需要显示该对话框的地方包含对应的头文件,显示即可。

区别:

QT显示模态对话框使用函数QDialog::exec();VS显示模态对话框使用函数CDialog::DoModal();

QT显示非模态对话框使用函数QDialog::show();VS显示非模态对话框使用函数CDialog::ShowWindow(SW_XXX),并且VS在显示非模态对话框之前必须创建一个对话框资源,即一个对话框和其界面并不是绑定的。一个对话框类可以没有对话框资源,如果调用一个没有对话框资源的对话框类的ShowWindow函数就会发生错误,MFC提供函数Create方法从对话框模板中创建一个对话框资源。另外,对话框资源创建好后并不一定会显示出来,需要调用ShowWindow才能显示该对话框资源,关闭非模态对话框后,并不是销毁该对话框资源,而是将该对话框资源进行了隐藏,只有在调用了函数DestroyWindow后才真正将该对话框资源销毁,不能多次对一个对话框类创建资源,除非上一个创建的资源被销毁。

总结一下,QT的对话框资源类似于在创建对话框类的时候就自动进行了创建,而VS的对话框资源必须程序员调用Crate函数后才创建成功。当然,你可以再父对话框的构造函数中就将所用到的非模态对话框进行Create,那么,下面的使用就和QT完全一样了,或者是通过IsWindow(m_dlg.m_hWnd)函数判断非模态对话框对象是否已经关联了对话框资源,如果没有,再通过Create函数进行创建;或者是在非模态对话框的Close事件发生时,调用DestroyWindow函数,那么可以再次Create。注意,VS退出时需要将非模态对话框DestroyWindow掉。

 

信号、事件篇:

QT中的消息与槽机制类似于VS中MFC的命令与消息机制,其中QT中的消息对应于VS中的消息,槽对应消息处理函数。

QT中的事件机制与VS中MFC Wizard中的消息选项卡下的消息相似(微软的造词能力略拙计,都用消息。。。),该消息主要以WM_打头,其中消息对应的处理函数类似于QT中的事件,QT中的事件基本上是父类定义好的虚函数,并且能够很容易的在父类中找到定义的虚函数声明。而VS中的事件已afx_msg开头,前面没有virutal 声明。但是,在MyDlg::OnPaint()函数中 OnPaint中有调用父类的OnPaint的执行语句,声明该函数的确是继承自父类的虚函数,只是微软没有显示的在子类中说明而已。

消息对话框篇:

QT使用QMessageBox类进行消息对话框的显示,如显示警告,可通过QMessageBox::warning函数,调用该函数后,则能够弹出警告对话框。

VS使用AfxMessageBox和MessageBox显示对话框,其中AfxMessageBox为一个全局函数,通过产生指定图标、按钮等内容。

Qt返回的是QMessageBox::StandardButton类型,如QMessageBox::Ok,QMessageBox::Open等等;Vs返回的是一个int类型,为一个宏定义,如IDABORT、IDCANCEL等等;从此处可以看出Qt要比MFC年轻,c++中推荐使用枚举类型代替宏定义。

通用对话框篇:

QT使用QFileDialog用于获取文件路径,其有静态函数:

getExistingDirectory、getOpenFileName、getOpenFileNames、getSaveFileName。

 

VS使用QFileDialog类进行文件路径的获取。

其中CFileDialog的声明为:

ExplicitCFileDialog{

BOOL bOpenFileDialog,//指定构造“打开的文件”或“保存文件”对话框

LPCTSTR lpszDefExt=NULL,//后缀名

LPCTSTRlpszFileName=NULL,//文件名

DWORD dwFlags =OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,

//自定义文件标志

LPCTSTR lpszFilter = NULL,

CWnd* pParentWnd = NULL,

DWORD dwSize = 0,

BOOL bVistaStyle=TRUE

};

其中explicit的说明:C++中,一个参数的构造函数(或者是除第一个参数外,其他参数都有默认值的多参构造函数),承担了两个角色,一个是构造器,另一个是默认且隐含的类型转换操作符。

有时候,我们在写下如A=X,这样的代码,且恰好X的类型是A单参数构造器的参数类型,这时候,编译器就自动调用这个构造器,创建一个A对象,如果在构造器前面加上explicit修饰,指定这个构造器只能被明确的调用,不能作为类型转换操作符被隐含的使用(此处来自百度百科)。

(未完待续。。。)

你可能感兴趣的:(c++编程)