Qt学习笔记6
Qt框架简介
main.cpp内容
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);//声明qt应用程序
Widget w;//创建一个名为w的widget类窗口,执行类构造函数
w.show();//显示窗口w,因为qt创建的窗口默认隐藏,所以要手动显示
return a.exec();//a.exec()代表进入循环,qt的事件处理机制,除非遇到停止事件,否则一直运行下去
}
widget.h内容
定义窗口widget的属性与方法
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>//包含QWidget基类
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget//构建继承自Qwidget基类的新类
{
Q_OBJECT//信号与槽机制需要
public:
Widget(QWidget *parent = nullptr);//构造函数和析构函数,目前为空
~Widget();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
.pro文件内容
QT += core gui//模块
//高于4版本,添加QT += widgets,为了兼容qt4
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
//源文件
SOURCES += \
main.cpp \
widget.cpp
//头文件
HEADERS += \
widget.h
//设置文件
FORMS += \
widget.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
在Qt Creator中创建空项目,来了解Qt具体的运行机制
创建新项目——其他项目——空qmake项目
创建过后只存在.pro文件,在项目文件中添加
QT += widgets
在项目文件夹上右键选择添加c++源文件取名为main.cpp,根据上面的框架加上
#include<QApplication>
#include<QWidget>
int main(int argc,char *argv[]){
QApplication app(argc,argv);
return 0;
}
现在里面开始添加语句显示。
QWidget w;
w.setWindowTitle("helloworld");
w.show();
结果如下:
如果我想显示一个按钮,该怎么做?
1,包含Qpushbutton类
2,在下方语句中加上
QPushButton b;
b.setText("^_^");
b.show();
显示结果是出现两个窗口,一个是上面的,一个是单纯一个按钮,我的目的是在helloworld的窗口上显示按钮,怎么做??
如果不指定父对象,对象与对象是没有关系,独立存在的
a指定b为其父对象,a放在b上面
指定父对象有两种方式:
1,setParent
2,通过构造函数传参
指定父对象后,只需要父对象显示,上面的子对象自动显示
改变内容为:
QPushButton b;
b.setText("^_^");
b.setParent(&w);
//b.show();
b.move(100,100);
w.show();
即可显示我想要的结果。
构造函数传参的方法是:QPushButton b(&w);
以上是空项目全手打代码,目的是了解必要的每个部分的含义。
接下来用自带的模板来构建界面。
创建新项目——qtappication——继承Qwidgets——不生成界面文件
由此得到了.pro,main.cpp,以及自定义头文件与源文件,在main.cpp
中有
自定义类名 w;
w.show();
在这里第一行运行自定义类的构造函数,所以不在主函数中编写界面,我们如何编写界面显示呢??
在类中编写界面,并简要编写信号与槽函数。
我的第一反应就是在自定义类的.cpp文件中包含QPushbutton,然后设置两个按钮,显示,但这是不对的,为什么?类构造函数对比全局函数来讲是一个子函数,当子函数运行完之后空间会被释放,所以运行到w.show()的时候就会是一块白板。
正确的做法是在头文件中定义私有变量:
当然要提前包含QPushbutton类。
然后再后面的源文件中编辑。
为什么b2要用new分配空间?因为b2使用的是指针定义,要给它分配空间。
到这里就完成了上面同样的界面,那么这些按钮要如何工作呢,当我按下时他们执行的工作要如何设置???
方法是connect函数:
具体做法是在刚才的b1,b2设置内容之后加上
connect(&b1,&QPushButton::pressed,this,&MainWidget::close);
这里面:
&b1:信号发出者,指针类型
&QPushbutton::pressed:处理的信号, &发送者名字::信号名字
this:信号接收者
&MainWidgets::close:槽函数,信号处理函数 &接受的类名字::槽函数名字
这里的close函数是系统自带常函数
那么如何自定义槽函数??
自定义槽函数:
任意成员函数,普通全局函数,静态函数
槽函数需要和信号一致(参数,返回值)
由于信号都是没有返回值的,所以槽函数一定没有返回值
直接在类当中定义一个函数,然后在后面调用即可。
上一篇: Qt学习笔记5
下一篇: java8 Stream API