欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt学习笔记6

程序员文章站 2022-05-28 11:36:55
...

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();

结果如下:

Qt学习笔记6
如果我想显示一个按钮,该怎么做?

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()的时候就会是一块白板。

正确的做法是在头文件中定义私有变量:

Qt学习笔记6
当然要提前包含QPushbutton类。

然后再后面的源文件中编辑。

Qt学习笔记6
为什么b2要用new分配空间?因为b2使用的是指针定义,要给它分配空间。

到这里就完成了上面同样的界面,那么这些按钮要如何工作呢,当我按下时他们执行的工作要如何设置???

方法是connect函数:

具体做法是在刚才的b1,b2设置内容之后加上

connect(&b1,&QPushButton::pressed,this,&MainWidget::close);

这里面:
&b1:信号发出者,指针类型
&QPushbutton::pressed:处理的信号, &发送者名字::信号名字
this:信号接收者
&MainWidgets::close:槽函数,信号处理函数 &接受的类名字::槽函数名字

这里的close函数是系统自带常函数

那么如何自定义槽函数??

自定义槽函数:

任意成员函数,普通全局函数,静态函数

槽函数需要和信号一致(参数,返回值)
由于信号都是没有返回值的,所以槽函数一定没有返回值

直接在类当中定义一个函数,然后在后面调用即可。

相关标签: GUI

上一篇: Qt学习笔记5

下一篇: java8 Stream API