Qt的学习(二)

发布于:2025-06-10 ⋅ 阅读:(19) ⋅ 点赞:(0)

1. 创建Hello Word

        两种方式,实现helloworld:

        1.通过图形化的方式,在界面上创建出一个控件,显示helloworld

        2.通过纯代码的方式,通过编写代码,在界面上创建控件, 显示hello world;

1.1 图形化的方式

运行结果如下: 

1.2 纯代码的方式

        label“标签:界面上一个用来显示内容的字符串控件。 

widget源文件如下:

#include "widget.h"
#include "ui_widget.h"
#include <QLabel>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QLabel* label = new QLabel(this);
    //创建对象的时候可以在堆上创建,也可以在栈上创建,但是Qt中一般推荐在堆上创建对象
    //this,是指给当前的label对象,指定一个父对象this,this是指调用该构造函数的对象
    //即 main函数中的widget w这个对象
    //此处new的方式创建对象,主要是将这个对象的生命周期交给Qt的对象数来统一管理。
    //如果在栈上创建该控件对象,可能会存在提前释放的问题。
    
    label->setText("Hello World");
    //设置控件中,要显示的文本
    //QString会隐式显式
}

Widget::~Widget()
{
    delete ui;
}

1.3 内存泄露问题

        上述代码,在Qt中不会产生内存泄露,label对象会合适的时候被析构释放(虽然没有手动写delete,确实能释放)之所以能够把对象释放掉,主要是因为把这个对象是挂到了对象树上。Qt中搞了一个对象树,也是N义树,把界面上的各种元素组织起来了。

        通过这个树形结构,就把界面上要现实的这些控件对象都组织起来。组织的目的就是能够在合适的时候(窗口关闭/销毁),把这些对象统一进行释放。

如何查看文件的编码格式:

.cpp文件,点击右键,一explore方式打开进入资源管理器,将其文件以记事本的方式打开,点击另存为,查看文本框的编码格式。如果现实utf-8,说明这个文件就是utf-8编码;如果显示的是ansi,说明这个文件就是GBK编码。

Qt Creater内置的终端不一定是使用utf8的方式现实字符串。

         后续再Qt中,如果想通过打印日志的方式输出一些调试信息,都优先使用qDebug。虽然使用cout也行,但是cout对于编码的处理不太好,在windows上容易出现乱码(如果是Linux使用QtCreator,一般就没事,Linux默认的编码一般都是utf8)。
        使用qDebug,还有一个好处就是打印的调试日志,是可以统一进行关闭的。qDebug可以通过编译开关,来实现一键式关闭。

1.4 使用编辑框完成hw

编辑框分为单行编辑框(QLineEdit)和多行编辑框(QTextEdit);

form文件中图形化操作

纯代码操作:

#include "widget.h"
#include "ui_widget.h"
#include <QLineEdit>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLineEdit* edit = new QLineEdit(this);
    edit->setText("hello shangjialu");

}

Widget::~Widget()
{
    delete ui;
}

 1.5 使用按钮创建hw

        push button普通按钮

        Qt中的信号槽机制:本质就是给按钮的点击操作,关联上一个处理函数。当用户点击的时候,就会执行这个处理函数。

图形化界面操作 

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::handleClick);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::handleClick()
{
    //当按钮被点击之后,就把按钮中的文本进行切换
    if (ui->pushButton->text() == QString("hello shangjialu"))
    {
        ui->pushButton->setText("hello faka");
    }
    else {
        ui->pushButton->setText("hello shangjialu");
    }

}

纯代码的方式

#include "widget.h"
#include "ui_widget.h"
#include "widget.h"

#include <ui_widget.h>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    myButton = new QPushButton(this);
    myButton->setText("hello shangjialu");
    connect(myButton,&QPushButton::clicked,this,&Widget::handleClick);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::handleClick()
{
    if(myButton->text() == "hello shangjialu"){
        myButton->setText("shang linlu");
    }else{
        myButton->setText("hello shangjialu");
    }
}

 小结:

        对于纯代码版本,按钮对象是咱们自己new的。为了保证其他函数中能够访问到这个变量,就需要把按钮对象设定为Widget类的成员变量。

        对于图形界面版本版本,此时按钮对象,不需要咱们自己new。new对象的操作已经是被Qt自动生成了。而且这个按钮对象,已经作为ui对象里的一个成员变量,也无需作为Widget的成员。

        实际开发中,是通过代码的方式构造界面为主,还是通过图形化界面的方式构造界面为主。这两种,都很主要,难分主次。

        如果当前程序界面,界面内容是比较固定的,此时就会以图形化的方式来构造界面;但是如果程序界面,经常要动态变化,此时就会以代码的方式来构造界面。 

1.6 QtCreator中的快捷键

  注释:ctrl+/
  运行:ctrl+R
  编译:ctrl+B
  字体缩放:ctrl+鼠标滑轮
  查找:ctrl+F
  整行移动:ctrl+shift+个/
  帮助文档:F1
  自动对齐:ctrl+i
  同名之间的.h和.cpp的切换:F4生成函数声明的对应定义:alt+enter

1.7 Qt窗口坐标体系