推荐资源:
Qt教程,Qt5编程入门教程(非常详细) (biancheng.net)
QT学习教程(全面)
QT从入门到实战完整版|传智教育
Qt 是一个跨平台的 C++ 开库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序。
Qt 是纯 C++ 开发的。
这里咱们安装 Qt 5.14.2 (不要问为什么不装更新版本的,从 Qt 5.15.0 起,对于开源用户,Qt官方不再提供独立安装文件,所以源码安装太麻烦,以后再研究_)
官网下载链接:
Index of /archive/qt/5.14/5.14.2
下载完之后,直接双击打开安装包,进行安装即可
如果有Qt账号,直接登录就可以了,如果没有可以在下面注册一个,然后点Next(如果不想填写,请先断网,然后重新打开安装程序)(5.14之前的版本断网安装可以,5.15之后必须在线安装了)
现在你可以选择安装路径,建议大家自行修改一下(注意:路径中不能有空格,也不能有中文),确保自己能找到位置,后续可能会有一些配置,需要找到路径
路径设置完之后,到了选择组件的界面,如图:第二个组件不需要管,点开第一个组件Qt 5.14.2。
点开之后,把这些都选上,OK,下一步~(如果没有用VS开发Qt项目的需求可以不点 MSVC 2017)
我只选择了
MSVC 2017 64-bit
和MinGW 7.3.0 64-bit
进行安装
很多人在Qt上写代码时,感觉不是很舒服,所以想在Vs上写Qt程序,而且Vs具有强大的调试能力,所以咱们可以通过一些配置实现此目的。
选择菜单栏的 扩展->管理扩展,输入Qt搜索,然后下载Qt Visual Studio Tools
如果VS里面下载太慢,可以先到Qt官网下载对于版本的插件:https://download.qt.io/official_releases/vsaddin/2.4.1/
如果跳到如下页面,选择清华大学镜像源下载即可。
如果是通过Vs下载的,会自动安装。
如果是手动下载的,需要双击自己安装。
打开安装包之后,点击Install等待安装完成即可
安装之前,请先关掉Vs(关闭Vs之后,一秒安装完成)
再次打开VS,扩展->Qt VS Tools
新版的qt vsaddin插件,不再是用Qt Options设置Qt路径,而是Qt Version,如下图:
点击之后
注意qt路径,一直选择到qmake.exe
旧版教程:
再次打开VS,扩展->Qt VS Tools->Qt Options
点击Qt Options之后会弹出如下界面
如果在弹出上述界面的同时,还弹出如下这个错误界面,不要担心,这是由于安装插件的时候,会自动配置,但是自动配置的路径和实际的Qt安装路径不一致,我们自己再配置一下就ok了
首先删掉自动配置好的路径,然后点击Add自己添加一个,如下是具体的路径选项,选择msvc2017_64文件夹,点击确定即可
然后点击OK(Name是自己取的)
在Vs中点击新建项目,搜索Qt找到 Qt GUI Application 然后点击下一步。
然后从Debug和Release模式里选择一个即可(默认即可)
点击Next,选择模块(以默认选好)继续Next,然后选择GUI的基类为QWidget,选择小写字体
点击Finish完成创建!最后,Ctrl+F5(运行),大功告成
新版步骤:
选择Qt版本与编译方式,选择debug即可,创建后,如果想用release发布,就在vs中换成release.
项目解决方案如下:
打开ui文件就可以拖拽控件了,如果你想手写ui也可以,新建Qt类即可,其它的编译调试和C++项目一样。
安装好之后,可能桌面没有快捷方式,那么我们可以去开始菜单栏找到快捷方式。
打开之后,界面如下所示
点击左上角的,文件->新建文件或项目
点击之后,进入了项目模板选择界面,选择Application->Qt Widgets Application点击Choose即可
选择项目位置。默认是下面这样,请自行修改(重要提醒:名称和路径中都不允许存在空格和中文,注意桌面
和文档
也是中文)
如果含有中文,编译时会出现如下错误:
一直点击下一步,之后来到这个界面,选择类信息。父类默认是QMainWindow,可以修改为QWidget(主要用来测试改不改都可以)
一直点击下一步,直到到达如下界面。构建套件选择。选择MinGW任意一个版本即可,然后点击下一步,点击完成即可
完成之后是这个界面
点击运行按钮,等待源码编译并执行。当你的桌面出现这个窗口是说明,你的Qt环境已经没问题了,而且也会创建一个Qt项目了
打开sources里面的main.cpp,可以看到以下代码
注意:
每个Qt程序有且只能有一个QApplication
对象,没有会报错,如下:
Qt里面的头文件和类名是一致的,知道头文件就知道类名,反之亦然
Qt头文件不同于C语言,是没有.h后缀的,基本都是以大写的Q开头
根据以上的分析,可以得出Qt的程序框架代码:
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
/*
在这里写你的代码
*/
return a.exec();
}
打开sources里面的widget.h,可以看到以下代码
打开sources里面的widget.cpp,可以看到以下代码
代码基本上都是在这两个文件中编写
qt_learn.pro是管理项目的文件,用来存储项目设置。
QT += core gui
表示项目中加入 core gui 模块。core gui 是 Qt 用于 GUI 设计的类库模块,如果创建的是控制台(Console)应用程序,就不需要添加 core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
这是条件执行语句,表示当 Qt 主版本大于 4 时,才加入 widgets 模块(Qt4没有这个模块)
DEFINES += QT_DEPRECATED_WARNINGS
使用被标记为弃用的Qt特性,会产生警告
# qt_learn项目拥有的源文件、头文件、窗体
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
以上文件列表是 Qt Creator 自动添加到项目管理文件里面的,用户无需手动修改。当添加一个文件到项目,或从项目里删除一个文件时,项目管理文件里的条目会自动修改。
进入项目选择界面->其他项目->空项目->choose
填写项目名和选择路径
——注意:不能有空格和中文
选择编译套件
注意:一定要选择MinGW。不选的话,项目创建之后会有问题
后面一步,直接点击完成即可进入编码界面
但是如果你看到的是这个界面(不是这个可以继续往下看),项目名称前面有的黄色的感叹号,说明项目没有配置成功——这是刚刚在选择编译套件时,选择错了
解决方法:
——点击左侧项目->重新选择编译套件->点击配置项目,ok~
当界面显示如下时,即表示配置成功了
打开.pro文件,添加如下配置
#加载三个核心模块
QT += core gui widgets
#添加对C++11的支持
CONFIG += c++11
右击项目名称->选择Add New…->选择C++模板->添加C++源文件
给文件取个名字
——点击下一步,然后点击完成
看到main.cpp之后就开始写代码吧
ps:pro文件会自动添加创建好的头文件和源文件
先写main函数框架
然后再Code下面添加自己写的代码:
——首先添加QWidget 和 Qicon头文件,然后用QWidget类创建一个窗口对象,并对窗口的一些属性进行设置
烦人的警告:libpng warning: iCCP: known incorrect sRGB profile
[产生的原因]:
使用Photoshop CS5编辑过的PNG文件,颜色设置采用了默认的sRGB IEC61966-2.1
就是这个sRGB IEC61966-2.1格式不标准,新的Qt库会提示警告。
[解决的方法]:
修改Photoshop CS5颜色设置,具体为编辑->颜色设置,工作空间RGB改为“ColorMatch RGB”,色彩方案RGB改为“转换为工作中的RGB”。
重新打开有问题的文件,保存一遍即可。
QPushButton是Qt中最基本的按钮类,使用方法也很简单
首先,包含QPushButton头文件
然后,在窗口show之前,创建按钮,并调用show
运行之后发现,按钮和widget分为了两个窗口,这不是我们想要的,我们需要把按钮嵌入到widget窗口上
要解决这个问题,需要把widget设为按钮的父亲窗口
给按钮设置父窗口
设置父窗口有两种方式:
1,通过构造函数设置,先看一下QPushButton的构造函数
2,通过成员函数setParent设置
值得注意的是,如果指定了父窗口,那么就可以不用手动调用show方法了,会跟着父窗口一起显示,一起销毁
代码:
Qt Creater快捷键:Qt Creator 快捷键 (qq.com)
show()
以顶层方式弹出窗口控件setParent()
选择依赖方式,参数是指针或引用,如setParent(this)
setText()
设置文本resize()
重置窗口大小move()
移动setWindowTitle()
设置窗口大小setFixedSize()
设置固定窗口大小new
出来的),如果指定的父对象是 基类QObject 派生下来的类或者子类,该对象就会被放到对象树上,对象树上的对象无需由程序员负责释放。QObject
,这样就不用自己手动delete
释放了父窗口的左上角为0,0点,X向右增加,Y向下增加
当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。这就类似观察者模式:当发生了感兴趣的事件,某一个操作就会被自动触发。
信号和槽有点类似Java中的接口,信号是接口,槽是接口的实现类。
连接函数
//connect(信号的发送者,信号的具体信息,信号的接受者,信号的处理[槽])
connect(sender, signal, receiver, slot);
参数解释:
sender:发出信号的对象
signal:发送对象发出的信号(函数地址)
receiver:接收信号的对象
slot:接收对象在接收到信号之后所需要调用的函数(槽函数)(函数地址)
信号槽的优点:松散耦合
信号发送端
和 接收端
本身是没有关联的,通过connect()
连接函数连接,将两者耦合在一起chlicked(bool)
点击pressed()
按下released()
释放toggled(bool)
切换状态自定义信号和槽位函数
自定义信号
写在类的signals:
下,返回值为void,可以有参数,支持重载,不需要实现
signals:
void hungury();
自定义槽函数
signals:
下,要写在public slots:
下 【5.4版本以后写成全局函数或者写在public:
下都行.】然后用connect连接信号和槽
触发信号 emit
信号和槽重载,需要函数指针,明确指向函数的地址
QString 转char * 使用.toUtf8().data()
信号和槽连接:触发这个信号才能触发槽
信号和信号连接 触发一个信号也能触发另外一个信号
断开信号 disconnect(参数一样)
C++11版本特性 [CONFIG += c++11] 匿名函数对象
Lambda表达式函数声明
Lambda表达式函数调用 {}()
最常见的[=](){}
* 菜单栏最多只能有一个
+ QMenuBar * bar = menuBar(); setMenuBar(bar);
+ 创建菜单
* QMenu * fileMenu = bar->addMenu("文件");
+ 创建菜单栏目
* QAction * newAction = fileMenu->addAction("新建");
+ 添加分隔符
* fileMenu->addSeparator();
* 工具栏可以有多个
+ QToolBar * toolBar = new QToolBar(this);
+ addToolBar(toolBar);
* 可选参数 默认停靠范围
+ addToolBar(Qt::BottomToolBarArea,toolBar);
* 只允许左右停靠
+ toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);
* 取消浮动
+ toolBar->setFloatable(false);
* 设置禁止移动
+ toolBar->setMovable(false);
* 给工具栏设置栏目
+ toolBar->addAction("绝了"或者QAction);
* 给工具栏添加控件
+ toolBar->addWidget(QPushButton按钮);
* 状态栏最多只能有一个
+ QStatusBar * stBar = statusBar();
+ setStatusBar(stBar);
* 添加标签控件
+ QLabel * label = new QLabel("左侧提示的信息",this);
+ QLabel * label1 = new QLabel("右侧提示的信息",this);
+ stBar->addWidget(label);
+ stBar->addPermanentWidget(label1);
* 铆接部件可以有多个
+ QDockWidget * dockWidget = new QDockWidget("浮动",this);
+ addDockWidget(Qt::BottomDockWidgetArea,dockWidget); 放置位置下面 如果没有中心部件默认占满
+ 只允许上下
* dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
* 中心内容也只能有一个
+ 文本窗口 QTextEdit
+ QTextEdit * edit = new QTextEdit(this);
+ setCentralWidget(edit); //设置中心部件
+ 只能有一个的是set 可以允许多个是add
//winLabel 你要对那个组件使用动画 geometry几何结构
QPropertyAnimation * an = new QPropertyAnimation(winLabel,“geometry”);
//动画时间
an->setDuration(1000);
//动画开始 an->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height()));
//动画结束
an->setEndValue(QRect(winLabel->x(),winLabel->y() + 300,winLabel->width(),winLabel->height()));
//动画方式
an->setEasingCurve(QEasingCurve::OutBounce);
an->start();