Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Windows服务器 > » 正文

【原创】用C++(QT)写跨平台GUI详解

来源: bbsunchen 分享至:

你还不知道什么是Qt?... ...什么?你还不知道C++能快速开发部署GUI?...you got be kidding me

这篇文章,教你怎么用Qt Creator2.0来做一个GUI。下载地址什么的不罗嗦,google之。我这里给出的,是每个QT GUI 工程用QT creator来做时的流程。

假设你已经安装好了qt sdk。

1.文件->新建工程或文件。

2.选择Qt控件项目->QT GUI应用。

3.取消 “隐藏生成的文件选项”

4.布局ui文件(这步的详细操作略去,很多书都会说这个,我只说书上说得不清楚的)

5.编译该ui文件,这时,会出现一个ui_xxx.h的文件。

接下来,就是代码修改了。这里分别给出原始文件和修改后的文件内容。代码注释在修改后的文件上。

以建立一个叫test的工程为例,修改后的工程,可以执行对话框的功能。

一、首先修改test.h

test.h未修改前代码:(需要说明的是,我的修改前代码和你的可能不同,不过没影响)

Cpp代码 
  1. #ifndef TEST_H  
  2. #define TEST_H  
  3.   
  4. #include   
  5.   
  6. namespace Ui {  
  7.     class test;  
  8. }  
  9.   
  10. class test : public QMainWindow  
  11. {  
  12.     Q_OBJECT  
  13.   
  14. public:  
  15.     explicit test(QWidget *parent = 0);  
  16.     ~test();  
  17.   
  18. private:  
  19.     Ui::test *ui;  
  20. };  
  21.   
  22. #endif // TEST_H  




修改后的test.h代码

Cpp代码 
  1. #ifndef TEST_H  
  2. #define TEST_H  
  3.   
  4. #include  //因为要继承QDialog  
  5. #include "ui_test.h" //引用了ui_test.h,ui_test.h文件不能做任何更改,即使做了更改,在再次编译test.ui的时候,这些更改都会消失  
  6.   
  7.   
  8. class GoToCellDialog : public QDialog, public Ui::GoToCellDialog  
  9. //这里声明的class名,惯例是使用Ui后面的名字  
  10. //为什么要继承QDialog?因为ui_test.h中定义的Ui::GoToCellDialog函数,没有完全继承QDialog的特性,接下来的操作中,还有可能用到  
  11. {  
  12.     Q_OBJECT//如果有声明signals, slots,则必须写这一句,这样qt的编译器才能识别下面的这些生命  
  13.   
  14. public:  
  15.     explicit GoToCellDialog(QWidget *parent = 0);//典型的窗口部件类定义中的构造函数,注意定义方式,没有必要关联基类  
  16.     //QWidget * parent参数用于说明谁是其父窗口部件,该参数的默认值是一个空指针,意味着该对话框没有父对象  
  17.     ~GoToCellDialog();//析构函数,可选,如果在这里声明,就必须实现  
  18.   
  19.  private slots:  
  20.     void on_lineEdit_textChanged();//注意这种slots的函数名书写方式  
  21.     //创建用户接口后,setup.html' target='_blank'>setupUi函数会自动将那些符合on_objectName_signalName()的任意slot与相应的objectName的signalName()连接  
  22.     //这里,就意味着,如果实现用户接口,就会自动运行如下代码  
  23.     //connect(lineEdit, SIGNAL(testChanged(const QString &)), this, SLOT(on_lineEdit_textChanged()));  
  24. };  
  25.   
  26. #endif // TEST_H  



这里的操作很简单:

1.删除关于namespace的声明代码段,因为已经在ui_test.h中有了声明

2.添加slot或者任何你想添加的函数



二、接下来修改test.cpp代码

test.cpp未修改前代码

Cpp代码 
  1. #include "test.h"  
  2. #include "ui_test.h"  
  3.   
  4. test::test(QWidget *parent) :  
  5.     QMainWindow(parent),  
  6.     ui(new Ui::test)  
  7. {  
  8.     ui->setupUi(this);  
  9. }  
  10.   
  11. test::~test()  
  12. {  
  13.     delete ui;  
  14. }  


这里的操作:

1.删除 "ui_test.h"的引用,因为在test.h中已经完成了

2. 增加#include 的引用

3.构造函数的实现,函数名 删除ui(new Ui::test)

4.ui->setupUi(this);改成setupUi(this);

5.做connect操作

6.实现slot函数和任何在test.h中声明的函数

7.实现析构函数,析构函数已经存在了,把里面那句话删掉,因为ui已经不存在了撒~



test.cpp修改后代码

Cpp代码 
  1. #include   
  2. #include "test.h"  
  3.   
  4. //现在开始实现test.h,这里,test.h中的类已经是通过继承的类了。注意这个文件include的文件  
  5. GoToCellDialog::GoToCellDialog(QWidget *parent) :  
  6.     QDialog(parent)//注意实现方式,parent参数传递给了基类构造函数,  
  7. {  
  8.     //子类的构造函数,可以看出,GUI程序的界面设计和功能实现,都是在构造函数中完成的。  
  9.     setupUi(this);//这里开始初始化自己  
  10.   
  11.     QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");  
  12.     lineEdit->setValidator(new QRegExpValidator(regExp, this));  
  13.   
  14.     connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));  
  15.     connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));  
  16.     //accept(),reject()槽都是QDialog的槽,这两个槽都可以关闭对话框,并且会设置对话框的值  
  17.     //QDialog::Accepted, QDialog::Rejected  
  18. }  
  19.   
  20. void GoToCellDialog::on_lineEdit_textChanged()  
  21. {  
  22.     okButton->setEnabled(lineEdit->hasAcceptableInput());  
  23. }  
  24.   
  25. GoToCellDialog::~GoToCellDialog()  
  26. {  
  27.     //todo  
  28. }  




三、修改main.cpp代码[/b]


main.cpp修改前代码

Cpp代码 
  1. #include   
  2. #include "test.h"  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     test w;  
  8.     w.show();  
  9.   
  10.     return a.exec();  
  11. }  



这里

1.删除对的引用,因为用不到

2.实现一个类,然后show它


main.cpp修改后代码

Cpp代码 
  1. #include   
  2.   
  3. #include "test.h"  
  4. //这里没啥好解释的...  
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication a(argc, argv);  
  8.     GoToCellDialog *dialog = new GoToCellDialog;//看下这个继承类的构造函数,注意这里采用默认参数0,即没有父类  
  9.     dialog->show();  
  10.   
  11.     return a.exec();  
  12. }  



然后编译运行,搞定。


可以说,基本上每个QT GUI工程都是按照这个来做的。修改后的代码执行一个对话框的功能。


Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史