如何使用回调函数去替代信号与槽

代码链接

一、qt使用回调实现文本框的回调显示

需要做到的效果

在这里插入图片描述
规则是:按WASD会前后左右进行便宜,每次偏移都是2。同时坐标也是在上面两个文本框进行显示,而这里回调需要实现的就是文本框移动的同时,需要在文本框里讲结果显示出来。

整体的逻辑实现

加载整个可视化界面——>文本框移动———同时———>更新文本框内容

可视化界面的逻辑包含关系

整体逻辑是这样的:
在这里插入图片描述

前面只是实现了界面的生成以及界面的包含关系,并且框架能做的就只有这么多,所以需要将相关的功能进行实现,一些根据,比如如果要实现小正方形在框架中移动就需要设计键盘事件:

  1. 设置MainWindow:设置总的一个界面类,是调用的入口的,同时也是对文本框的显示以及小方块的移动进行实现
    • 调用的入口,在资源文件设置入口(所以MainWindow是需要包含了可视化界面生成的ui对象的,也就是生成了MainWindow就生成了ui,在MainWindow里包含了ui对象的构造):
      在这里插入图片描述

    • 一些可视化插件的功能实现:

      1. 文本框:这里由于直接对其进行文本设置就行,比较简单所以并不需要进行
        在这里插入图片描述
      2. 小方块的移动实现 :通过特定的键盘值就发生对应的移动,直接通过移动函数,然后触发对应回调用来对文本框显示:
        在这里插入图片描述

对于qt设计师以及代码逻辑之间的关系理解

前面可能比较疑问设计师设计的界面的代码是怎么实现的,那么下面就进行解释,同时这部分也是MainWindow里的ui属性的
qt设计师对应的json格式

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
    <class>MainWindow</class>
    <widget class="QMainWindow" name="MainWindow">
        <property name="geometry">
            <rect>
                <x>0</x>
                <y>0</y>
                <width>800</width>
                <height>600</height>
            </rect>
        </property>
        <property name="windowTitle">
            <string>MainWindow</string>
        </property>
        <widget class="QWidget" name="centralwidget">
            <layout class="QGridLayout" name="gridLayout">
                <item row="0" column="0">
                    <widget class="QLineEdit" name="edt_x"/>
                </item>
                <item row="0" column="1">
                    <widget class="QLineEdit" name="edt_y"/>
                </item>
                <item row="1" column="0" colspan="2">
                    <widget class="QWidget" name="widget" native="true">
                        <property name="styleSheet">
                            <string notr="true">border:1px solid black;</string>
                        </property>
                        <widget class="Square" name="square">
                            <property name="geometry">
                                <rect>
                                    <x>280</x>
                                    <y>120</y>
                                    <width>100</width>
                                    <height>100</height>
                                </rect>
                            </property>
                            <property name="styleSheet">
                                <string notr="true">background-color: rgb(85, 255, 0);</string>
                            </property>
                            <property name="frameShape">
                                <enum>QFrame::NoFrame</enum>
                            </property>
                            <property name="frameShadow">
                                <enum>QFrame::Raised</enum>
                            </property>
                        </widget>
                    </widget>
                </item>
            </layout>
        </widget>
        <widget class="QMenuBar" name="menubar">
            <property name="geometry">
                <rect>
                    <x>0</x>
                    <y>0</y>
                    <width>800</width>
                    <height>26</height>
                </rect>
            </property>
        </widget>
        <widget class="QStatusBar" name="statusbar"/></widget>
    <customwidgets>
        <customwidget>
            <class>Square</class>
            <extends>QFrame</extends>
            <header location="global">Square.h</header>
            <container>1</container>
        </customwidget>
    </customwidgets>
    <resources/>
    <connections/>
</ui>

其实这里对应的就是在qt设计师界面里的对象查看器里的内容
在这里插入图片描述
在这里插入图片描述
接着我们可以看生成的代码的实现,注意这是生成的代码,而不是自己写的代码,这里说结论,其实生成的代码和我们自己写的原理是一样的,要和界面一一对应:
在这里插入图片描述
后面还会进行设置包含关系,当然实际实现是通过qt框架进行实现了:
在这里插入图片描述

回调那部分逻辑

在Square.cpp里实现

// 注册回调函数
void Square::setCallbackFunc(CallBack func)
{
    m_func = func;
}

//重载了键盘的事件
void Square::keyPressEvent(QKeyEvent* e)
{
    QPoint point = this->pos();

    int key = e->key();
    if (key == Qt::Key_W)
        point += QPoint(0, -2);
    if (key == Qt::Key_A)
        point += QPoint(-2, 0);
    if (key == Qt::Key_S)
        point += QPoint(0, 2);
    if (key == Qt::Key_D)
        point += QPoint(2, 0);
    //    cout << QTime::currentTime ();
    //    m_func(this->pos ());

    this->move(point);//这里进行了移动
    //    emit moved(point);    // 传统的信号槽
    m_func(point);      // 调用回调函数,回调是进行回调显示
}

在MainWindow里进行设置键盘聚焦就行,也就是将相关设置好:

 m_square->setCallbackFunc(func);
ui->square->setFocus();//接收键盘输入的句柄,也就是让正方形获得键盘的信号

二、使用信号与槽实现文本框的显示

其他一致,主要回调那里有一点不同。在发送信息那里直接使用回调函数替代了,而信号与槽这里就是发送信号,在对应调用的地方记得关联槽函数,其实就是和前面的回调函数的实现一样。

参考文章

  1. Qt之回调函数:6 在QT中使用回调函数替代信号槽:https://blog.csdn.net/hitzsf/article/details/117693472
  2. Qt Creator 中 ui 文件和 Qt 代码关系:https://blog.csdn.net/fuhanghang/article/details/123530321
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值