初识Qt · 实现Hello world的N种细节和坐标系

目录

前言:

文本编辑框实现

[Push button实现](#Push button实现)

简述信号与槽

小小的总结

如果是纯代码的方式:

如果是图形化的方式:

坐标系


前言:

前文我们花费了许多时间,介绍了使用label实现hello world的多种细节,主要是包括了纯代码的方式和图形化的方式是否会引发内存泄漏和乱码的问题,从而引出了QT在这两个方面的具体处理,剩下的小点就是ui界面插入控件之后的xml格式的ui文件发生了哪些变化,加上简单理解了一下对象树的概念。

在本文,我们学习使用其他的方式打印Hello world,并且介绍其中隐藏的细节。

那么废话不多说,进入主题吧!


文本编辑框实现

对于编辑框,分为两种,一种是单文本编辑框,一种是多文本编辑框。

其中,Line Edit和Text Edit分别就是单文本编辑框和多文本编辑框。

我们这里就使用纯代码的方式和图形化的方式操纵单文本编辑框来打印一个Hello world。

第一种是纯代码的方式,十分简单,一个拖拽,一个输入就完事儿了,我们不止可以双击该文本操作,我们也可以选中右边的属性列表:

这个text即文本编辑内容。

然后是纯代码方式:

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLineEdit* lineEdit = new QLineEdit(this);
    lineEdit->setText("Hello world");
}

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

这是纯代码的方式,可以说和之前使用label实现一点差别没有。

接下来我们看看使用button实现。


Push button实现

同样,我们先使用一下图形化的方式:

选中push button,直接拖拽,然后输入对应的内容即可。

接着是纯代码的方式:

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLineEdit* lineEdit = new QLineEdit(this);
    lineEdit->setText("Hello world");

    QPushButton* pushbutton = new QPushButton(this);
    pushbutton->setText("Hello qt");
}

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

好了以上是两种Hello world的打印,那么,本文也是~啊~不可能就这样结束的。

你说,这个按钮按下了难道就按下了吗?显然不能,所以我打算在这里十分简单的介绍一下信号槽这个概念。


简述信号与槽

信号与槽这个概念可以说是QT中的核心,但是更细节的地方呢,我们放在之后介绍,我们现在简单理解就是,当我们按下按钮之后,会发送一个信号,然后我们可以使用connect函数捕捉,执行关联函数,具体使用为:

cpp 复制代码
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

    void headle()
    {
        qDebug() << "Hello linux";
    }


private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QLineEdit* lineEdit = new QLineEdit(this);
    lineEdit->setText("Hello world");

    QPushButton* pushbutton = new QPushButton(this);
    pushbutton->setText("Hello qt");

    connect(ui->pushButton,&QPushButton::clicked,this,&Widget::headle);

}

当我们多次点击按钮:

我们也可以用来修改文本内容,可以实现点击按钮,切换两个文本的这个功能,函数就可以写为:

cpp 复制代码
void Widget::Headle()
{
    if(pushbutton->text() == "Hello world")
        pushbutton->setText("Hello qt!");
    else
        pushbutton->setText("Hello world");
}

如果我们是在ui界面拖拽的控件,那么对应应该是ui->pushbutton,它的name从这里看即可:

在QObject会为每一个拖拽出来的控件分配名字,咱们也可以自己编辑。


小小的总结

可能到这里部分同学看的是比较乱的,我们不妨简单总结一下。

如果是纯代码的方式:

那么我们需要在widget这个类里面添加我们需要connect的对象:

cpp 复制代码
class Widget : public QWidget
{
    Q_OBJECT

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

    void Headle();
private:
    Ui::Widget *ui;
    QPushButton* pushbutton;
};

不然我们访问构造函数的时候,该成员都不存在我们如何访问?

如果是图形化的方式:

不少同学是会疑惑,为什么我们需要使用Ui指针,凭什么ui指针里面有它?

我们不妨看看ui指针的类型:

cpp 复制代码
private:
    Ui::Widget *ui;
    QPushButton* pushbutton;

它是Ui命名空间域里面的widget类型,那么我们在ui文件生成的头文件里面看:

会发现Ui命名空间域里面有一个类,叫做Widget,继承Ui_Widget,那么Ui_Widget这个类,是通过ui文件通过qmake自动生成的,发现里面有我们刚才拖拽的button,这是不是就说得通了?

算是简单理解了一下纯代码方式和图形化方式的一个区别。


坐标系

关于坐标系非常简单:

不同于数学中的坐标系,这里面的坐标系是这样的,并且坐标是基于自己的父类:

通过使用函数move即可修改。

小知识:坐标系背后的单位是像素点。


感谢阅读!

相关推荐
青春_strive25 分钟前
Qt:文件
开发语言·qt
wen__xvn26 分钟前
每日一题蓝桥杯P8598 [蓝桥杯 2013 省 AB] 错误票据c++
开发语言·数据结构·c++·算法
fleetstar39 分钟前
如何使用go本地编译caddy插件
开发语言·后端·golang
IT北辰1 小时前
源码:用Python进行电影数据分析实战指南
开发语言·python
重生之成了二本看我逆天改命走向巅峰1 小时前
从0搭建Tomcat第二天:深入理解Servlet容器与反射机制
java·开发语言·笔记·学习·servlet·tomcat·idea
rkmhr_sef1 小时前
Java进阶:Dubbo
java·开发语言·dubbo
数维学长9861 小时前
【2025rust笔记】超详细,小白,rust基本语法
开发语言·笔记·rust
不止会JS2 小时前
cursor使用经验分享(java后端服务开发向)
java·开发语言·经验分享·cursor
徐白11772 小时前
Rust WebAssembly 入门教程
开发语言·rust·wasm
solomonzw2 小时前
C++ 学习(八)(模板,可变参数模板,模板专业化(完整模板专业化,部分模板专业化),类型 Traits,SFINAE(替换失败不是错误),)
c语言·开发语言·c++·学习