Qt Console Application 与 Qt GUI Application互转

在桌面开发中,总的来说,包含两种类型的应用程序:无界面的Console程序和有界面的GUI程序。Qt也不例外,包含Qt Console Application和Qt GUI Application。

一、Qt Console Application

在VS2015中创建一个Qt Console Application,默认会生成一个main.cpp源文件,代码如下,

#include <QtCore/QCoreApplication>
#include <iostream>   //自行添加int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//如果要打印Hello Qt,直接采用C++中的cout对象即可std::cout << "Hello Qt" << std::endl;return a.exec();   //开始主线程事件循环
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

解析:在main函数中主要创建了一个QCoreApplication类的对象,然后执行了这个对象的exec操作。 
QCoreApplication类继承自QObject,而QObject类是Qt中最基本的类,所有类的基类。 
QCoreApplication这个类是整个应用程序的核心,用于程序的初始化,生成事件循环,程序退出等一系列动作。

二、Qt GUI Application

三种主窗体

Qt有三种类型的主窗体:QDialog, QWidget, QMainWindow。

  • QWidget 
    QWidget类是所有用户界面对象的基类,其中QDialog和QMainWindow继承自它。 
    它有以下的特点:

    1. Widget是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己, 最常见的就是控件(按钮、编辑框等);
    2. 每个Widget都是矩形的,它们按照Z-order进行排序;
  • QDialog 
    QDialog类是对话框窗口的基类。一般作为顶级窗口(没有父窗口的窗口称为顶级窗口)与用户交互。 
    常见的对话框窗口有:文件选择窗口、颜色和字体选择窗口等。

  • QMainWindow 
    提供一个有中心部件,菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。

锚接部件 
1. 锚接部件一般多为一个容器来使用,以包容其他窗口部件来实现功能; 
2. 对于一个标准的Qt主窗口而言,锚接部件并不是必须的; 
3. 锚接部件可以作为一个窗口浮动在主窗口的上面,也可以像工具栏一样停靠在主窗口的上、下、左、右4个方向; 
4. 一个主窗口可以包含多个锚接部件。 
中心部件 
1. 主窗口的中心,一个主窗口只有一个中心部件。主窗口有自己的布局管理器,因此不能再给主窗口设置布局,但是可以给中心部件设置布局。

创建界面的三种方法

  • 手工设计界面 
    使用手工创建代码时,需要从Qt已有的GUI类库中选择一个类作为基类继承,并且添加必要的其它成员。通常,我们会选择从QDialog、 QWidget、QMainWindow等类中选择一个作为主窗体;然后创建其它的控件,并使用布局管理器布局这些控件;最后将该布局设置为主窗体的布 局。如下面例子所示,
#include <QtWidgets/QApplication>
#include <QtWidgets/QDialog>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
#include <QtWidgets/QHBoxLayout>class MyDlg : public QDialog
{
public :MyDlg(QWidget* parent = Q_NULLPTR) :QDialog(parent){/** @breif QT5中如何解决中文乱码问题:* 常量:QString::fromLocal8Bit和QStringLiteral* 对于字符串变量,使用QString自带函数*/plabel = new QLabel(QString::fromLocal8Bit("姓名"));pEdit = new QLineEdit;// 使用布局管理器布局控件QHBoxLayout *Layout = new QHBoxLayout;Layout->addWidget(plabel);Layout->addWidget(pEdit);// 设置窗口的布局管理器setLayout(Layout);setWindowTitle(tr("Find"));setFixedHeight(sizeHint().height());}
private:QLabel* plabel;QLineEdit* pEdit;
};
int main(int argc, char *argv[])
{QApplication a(argc, argv);MyDlg mydlg;mydlg.show();return a.exec();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 使用Qt Designer设计界面 
    采用Qt Designer,使得快速创建对话框成为可能。在Qt Designer环境中,所有的操作都采用可视化的操作,可拖放控件、关联信号与槽、设置特定控件的属性。如下图所示, 
    这里写图片描述

  • 动态加载UI文件并生成界面 
     前面的两种方法需要事先创建好相应的文件或代码,然后连同其它文件进行编译,如果后期要修改界面则必须修改代码或UI文件并重新编译。 
     而不需要重新编译整个程序的方法是采用动态加载UI文件的方式。UI文件采用Qt Designer编辑,然后在程序中调用UI文件,如下面代码所示,

#include "guitest3.h"
#include <iostream>
#include <QtWidgets/QApplication>
#include <QFile>
#include <QtUiTools/QtUiTools>
#include <QString>#pragma comment(lib, "Qt5UiToolsd.lib")
int main(int argc, char *argv[])
{QApplication a(argc, argv);QUiLoader loader;QFile file("./dialog.ui");loader.load(&file)->show();return a.exec();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

QApplication 
QApplication 类管理图形用户界面应用程序的控制流和主要设置。 可以说 QApplication是Qt的整个后台管理的命脉,它包含主事件循环,在其中来自窗口系统和其它资源的所有事件被处理和调度。它也处理应用程序的初始化和结束,并且提供对话管理。它也处理绝大多数系统范围和应用程序范围的设置。 
对于任何一个使用Qt的图形用户界面应用程序,都正好存在一个QApplication对象,而不论这个应用程序在同一时间内是不是有0、1、2或更多个窗口。

三、Qt Widgets、QML、Qt Quick的区别

QT为了进一步的实现界面和逻辑代码的分离,引入了Qt Quick库,可以让用户很方便的配置丰富的应用界面。与传统的Qt Widgets相比,


  1. Qt Quick用脚本QML及JS,类似于DirectUI;而Qt Widgets用C++,即传统GUI。
  2. Qt Quick是一种脚本语言(类似于css)。Qt是开发平台,包含了Qt Quick的运行库。Qt和Qt Quick的关系就像 “网页”与“样式表”的关系。
  3. 如果你的界面使用Qt Gui写的,那么用不了qml,因为qml的主要作用就是用来做画面的。把Qt Gui程序当成一个C++程序来看。如果想显示qml做的画面,在Qt Gui程序中打开qml的画面,而不要打开QWidget那种画面即可。
  4. QtQuick完成qml脚本到c++的转换(就像网页中的javascript不需要编译,可以直接运行一样)。这样不需要编译,就可以直接改脚本来实现功能,在嵌入式设备里用起来很方便。 

详细可以参见“一去丶二三里”的博客:https://blog.csdn.net/liang19890820/article/details/54141552

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hhhuang1991/article/details/79795879

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

GUI转为console mode

在main.cpp中的修改main,其他的不改

int main(int argc, char *argv[])  //or int main(int argc, char **argv)

{

     //红色为GUI的code

    QApplication a(argc , argv);

    //MainWindow w; //改为console mode时需要屏蔽

    //w.show(); //改为console mode时需要屏蔽

    //return a.exec(); //改为console mode时需要屏蔽


    //灰色为console mode的code

    MainWindow RunConsole;

    return RunConsole.RunConsoleMode(argc,argv);

}


MainWindow 这个class中定义public RunConsoleMode(argc,argv)这个API

RunConsoleMode(int argc, char **argv)

{

    for(int i = 0; i<argc ; i++)

    {

        printf("**argv[%s]" , argv[i] ); //打印出console mode的输入参数

    }

}

如cmd输入:AA.exe -a -b

则argv[0] = "AA.exe" ; argv[1]  = "-a" ;  argv[2] = "-b"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Create Volume 操作(Part I) - 每天5分钟玩转 OpenStack(50)

2019独角兽企业重金招聘Python工程师标准>>> 前面已经学习了 Cinder 的架构和相关组件&#xff0c;从本节我们开始详细分析 Cinder 的各种操作&#xff0c;首先讨论 Cinder 如何创建 volume。 Create 操作流程如下&#xff1a; 客户&#xff08;可以是 OpenStack 最…

如何有效解决C与C++的相互调用问题

from&#xff1a;https://blog.csdn.net/gobitan/article/details/1532769在实际工作中可能经常要进行C和C的混合编程&#xff0c;C调用C语言的代码通常都比较容易&#xff0c;但也有一些细节需要注意。C要调用C的代码就略为麻烦一些&#xff0c;因为C不支持面向对象的特征。一…

Eclipse开发工具之崩溃和备份

1.通过在命令行中输入“where java”&#xff0c;找到除jdk目录下的所有java相关程序&#xff0c;直接删掉&#xff08;一般会在C:WINDOWSsystem32下&#xff09;以后再也不用怕找不到目录了 2.内存不足&#xff0c;打开Eclipse目录下的eclipse.ini&#xff0c;把里面的-Xmx512…

IOS-网络(监听网络状态)

1 //2 // BWNetWorkTool.h3 // IOS_0131_检测网络状态4 //5 // Created by ma c on 16/1/31.6 // Copyright © 2016年 博文科技. All rights reserved.7 //8 9 #import <Foundation/Foundation.h> 10 11 interface BWNetWorkTool : NSObject 12 ///是否是WiFi …

C++中的friend详细解析

C中的友元机制允许类的非公有成员被一个类或者函数访问&#xff0c;友元按类型分为三种&#xff1a;普通非类成员函数作为友元,类的成员函数作为友元&#xff0c;类作为友元。友元包括友元的声明以及友元的定义。 友元的声明默认为了extern&#xff0c;就是说友元类或者友元函数…

【VMCloud云平台】拥抱Docker(六)关于DockerFile(1)

之前我们说过通过Docker pull来下载Images创建容器&#xff0c;这一次我们来聊下如何通过DockerFile创建Images再创建容器&#xff0c;Dockerfile也是Docker中的重点&#xff0c;使用DockerFile能够更加便捷轻量的存储标准化环境&#xff0c;也是环境管理的重要手段&#xff0c…

C++中相对路径与绝对路径以及斜杠与反斜杠的区别 及 处理代码

转载自&#xff1a;http://blog.csdn.net/sszgg2006/article/details/8447176文件路径正斜杠和反斜杠正斜杠&#xff0c;又称左斜杠&#xff0c;符号是"/"&#xff1b;反斜杠&#xff0c;也称右斜杠&#xff0c;符号是"\"。文件路径的表示可以分为绝对路径…

01参考资料

《Visual C#经典游戏编程开发》 目标&#xff1a; 掌握小游戏开发的思路&#xff0c;在实际开发过程中&#xff0c;思考实践面向对象&#xff0c;为cocos2d-x开发打下基础转载于:https://www.cnblogs.com/sharpfeng/p/5181260.html

WPF的二维绘图(一)——DrawingContext

DrawingContext比较类似WinForm中的Graphics 类&#xff0c;是基础的绘图对象&#xff0c;用于绘制各种图形&#xff0c;它主要API有如下几种&#xff1a; 绘图API 绘图API一般形为DrawingXXX系列&#xff0c;常用的基础的绘图API有&#xff1a; DrawEllipseDrawGeometryDrawG…

Windows系统编程之进程间通信

Windows系统编程之进程间通信作者&#xff1a;北极星2003来源&#xff1a;看雪论坛&#xff08;www.pediy.com&#xff09;Windows 的IPC&#xff08;进程间通信&#xff09;机制主要是异步管道和命名管道。&#xff08;至于其他的IPC方式&#xff0c;例如内存映射、邮槽等这里…

前端知识体系收藏

1. 布局框架&#xff1a; Bootstrap: http://getbootstrap.com/ Foundation: http://foundation.zurb.com/ Uikit: http://www.getuikit.com/ Web Components:http://css-tricks.com/modular-future-web-components// 2. 构建工具及包管理器&#xff1a; Grunt: http://gruntjs…

20分钟快速了解Redis

Redis可以说是目前最火爆的NoSQL数据库&#xff01; 过去几年&#xff0c;Memcached很盛行&#xff0c;现在有很多公司已将Memcached替换成了Redis。当然&#xff0c;很多人替换并不清楚为什么&#xff0c;只是感觉不想让主流抛弃&#xff0c;这也充分反映了目前Redis的强势。 …

进程通信例子

from&#xff1a;https://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.beginoutputreadline(vvs.80).aspx?cs-save-lang1&cs-langcsharp#code-snippet-4备注可同步或异步读取 StandardOutput 流。Read、ReadLine 和 ReadToEnd 等方法对进程的输出流执行…

IDEA15 下运行Scala遇到问题以及解决办法

为了让Scala运行起来还是很麻烦&#xff0c;为了大家方便&#xff0c;还是记录下来&#xff1a; 1、首先我下载的是IDEA的社区版本&#xff0c;版本号为15. 2、下载安装scala插件&#xff1a; 2.1 进入设置菜单。 2.2 点击安装JetBrains plugin 2.3 输入scala查询插件&#xff…

通过扫码自定义链接安装iOS app,版本更新总结。

1、打包ipa&#xff0c;plist工具&#xff1a;xcode6证书&#xff1a;企业级开发证书 1.1&#xff09;xcode6开始企业级打包时不在生成plist&#xff0c;需要自己编写&#xff1a;模版见下&#xff1a; <?xml version"1.0" encoding"UTF-8"?><!…

安排与愿想

机器学习的理论学了好久了&#xff0c;对于回归&#xff0c;分类&#xff0c;聚类&#xff0c;数据的预处理的各种算法也有了深刻认识&#xff1b; 但纸上谈兵&#xff0c;没有意义&#xff1b; 从今天开始用起来吧&#xff0c;把各种算法的实践以及思路记录下来&#xff0c;附…

pdf破解版

网页说明http://aikongke.com/3754.html1118-1805-7284-0295-8107-3663您好 亲 看到您拍的宝贝了&#xff01; 链接&#xff1a;http://pan.baidu.com/s/1c0iE44C 密码&#xff1a;bnyc XI版转载于:https://www.cnblogs.com/computerMatainance/p/5192834.html

使用try-with-resources替代try finally释放资源

2019独角兽企业重金招聘Python工程师标准>>> 1、旧社会 Java里&#xff0c;对于文件操作IO流、数据库连接等开销非常昂贵的资源&#xff0c;用完之后必须及时通过close方法将其关闭&#xff0c;否则资源会一直处于打开状态&#xff0c;直至程序停止&#xff0c;增加…

MFC模态对话框和非模态对话框

MFC中对话框有两种形式&#xff0c;一个是模态对话框&#xff08;model dialog box&#xff09;&#xff0c;一个是非模态对话框&#xff08;modeless dialog box&#xff09;。一、模态对话框&#xff08;model dialog box&#xff09;在程序运行的过程中&#xff0c;若出现了…

平板电脑离寿终正寝还有多远?

近期有评论称&#xff0c;因为大尺寸智能手机越来越普及&#xff0c;小尺寸平板正遭受着越来越严重的冲击&#xff0c;在这样的背景下&#xff0c;平板厂商也纷纷转攻超大尺寸平板市场&#xff0c;以此避开大尺寸智能手机的竞争&#xff0c;只是。这样的策略转变是否能扭转平板…