【Qt】Qt界面构建指南:实现Hello World的多种方式

发布于:2024-05-02 ⋅ 阅读:(30) ⋅ 点赞:(0)

前言:

本文将介绍如何在Qt中使用编辑框和按钮来实现Hello World的功能,并对纯代码版面和图形化界面版本进行比较。通过示例代码和说明,读者将了解如何使用Qt中的控件和信号槽机制来构建简单的用户界面。

1. 使用编辑框来完成 hello world

单行编辑框:QLineEdit
多行编辑框:QTextEdit

在这里插入图片描述
在这里插入图片描述

  • 使用纯代码的方式完成上述功能:
#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 word");
}

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

2. 通过按钮的方式来创建 hello world

在这里插入图片描述
在这里插入图片描述

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

Qt中的信号槽机制是一种用于实现事件驱动编程的方式,它允许对象之间在不直接耦合的情况下进行通信。在Qt中,信号是事件触发的标志,而槽是接收信号后执行的处理程序。

信号槽机制

  • 信号(Signal):当对象的状态或属性发生变化时,会发出信号。信号本身不包含任何逻辑,只是用来触发相关槽的执行。
  • 槽(Slot):槽是一个可以与信号关联的函数。当信号被触发时,槽会被调用,从而执行特定的操作。

使用connect连接信号与槽
connect()是Qt中的一个静态函数,用于将信号与槽连接起来。当信号被触发时,关联的槽就会被调用。 connect()
的基本语法如下:

QObject::connect(sender, SIGNAL(signalName()), receiver,SLOT(slotName()));

其中,sender是发出信号的对象,signalName是信号的名称,receiver是接收信号的对象,slotName是槽的名称。

与TCP的connect()不同 在Linux网络编程中,connect()是用于建立TCP连接的函数,通常用于客户端和服务器之间建立连接,以便进行数据传输。
Qt中的connect()与网络编程的connect()没有关系。它用于将信号与槽连接,而不是建立网络连接。

在这里插入图片描述
在 Qt Designer 中创建一个控件的时候,此时就会给这个控件的时候,此时就会给这个控件分配这个控件分配一个 objectName 属性。
这个属性的值,要求是在界面中是唯一的。(不能和别人重复)
会自动生成一个,当然也可以修改为别的,
qmake 在预处理 .ui

在这里插入图片描述

// widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>


QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void handleClick();
private:
    Ui::Widget *ui;

};
#endif // WIDGET_H
// widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>


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

    //访问form file(ui文件)中创建的控件
    connect(ui->pushButton, &QPushButton::clicked, this, &Widget::handleClick);
}

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

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

纯代码的方式:

// widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void handleClick();
private:
    Ui::Widget *ui;
    QPushButton* myButton;
};
#endif // WIDGET_H
// widget.cpp
#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("hallo world");

    connect(myButton, &QPushButton::clicked, this, &Widget::handleClick);
}

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

void Widget::handleClick()
{
    if (myButton->text() == QString("hello world")) {
        myButton->setText("hello qt");
    } else {
        myButton->setText("hello world");
    }
}

3. 纯代码版面 vs 图形化界面版本

在Qt中,构建界面有两种主要方式:纯代码版面和图形化界面版本。每种方式都有其优势和适用场景,实际开发中的选择取决于界面的固定性和动态变化需求。
纯代码版本
在纯代码版面中,按钮对象是通过手动创建的,通常需要将其设定为 Widget 类的成员变量。这种方式的优势在于可以更灵活地控制界面的构建过程,适用于需要动态生成界面或者界面内容不断变化的场景。
图形化界面版本
在图形化界面版本中,按钮对象是由Qt自动生成的,并作为UI对象的一个成员变量存在。无需手动创建对象,也不需要将其设定为 Widget 的成员变量。这种方式适用于界面内容相对固定的情况,可以通过可视化界面设计工具快速构建界面,提高开发效率。

选择合适的方式
在实际开发中,选择合适的界面构建方式取决于界面的固定性和动态变化需求。如果界面内容较为固定,通常会选择图形化界面方式;而如果界面需要经常动态变化,就会倾向于采用代码方式构造界面。不过,这两种方式并没有明确的主次之分,而是根据具体情况灵活选择。甚至可以结合两种方式使用,根据需求动态调整界面构建方式,以提高开发效率和灵活性。

总结:

在Qt中,可以通过编辑框和按钮等控件来实现Hello World的功能。使用编辑框时,可以选择单行编辑框(QLineEdit)或多行编辑框(QTextEdit),通过纯代码或图形化界面两种方式进行界面构建。通过按钮的方式实现Hello World时,需要利用Qt中的信号槽机制,将按钮的点击事件与相应的处理函数关联起来。选择合适的界面构建方式取决于界面的固定性和动态变化需求,可以根据具体情况灵活选择。