一、qt使用回调实现文本框的回调显示
需要做到的效果
规则是:按WASD会前后左右进行便宜,每次偏移都是2。同时坐标也是在上面两个文本框进行显示,而这里回调需要实现的就是文本框移动的同时,需要在文本框里讲结果显示出来。
整体的逻辑实现
加载整个可视化界面——>文本框移动———同时———>更新文本框内容
可视化界面的逻辑包含关系
整体逻辑是这样的:
前面只是实现了界面的生成以及界面的包含关系,并且框架能做的就只有这么多,所以需要将相关的功能进行实现,一些根据,比如如果要实现小正方形在框架中移动就需要设计键盘事件:
- 设置MainWindow:设置总的一个界面类,是调用的入口的,同时也是对文本框的显示以及小方块的移动进行实现
-
调用的入口,在资源文件设置入口(所以MainWindow是需要包含了可视化界面生成的ui对象的,也就是生成了MainWindow就生成了ui,在MainWindow里包含了ui对象的构造):
-
一些可视化插件的功能实现:
- 文本框:这里由于直接对其进行文本设置就行,比较简单所以并不需要进行
- 小方块的移动实现 :通过特定的键盘值就发生对应的移动,直接通过移动函数,然后触发对应回调用来对文本框显示:
- 文本框:这里由于直接对其进行文本设置就行,比较简单所以并不需要进行
-
对于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();//接收键盘输入的句柄,也就是让正方形获得键盘的信号
二、使用信号与槽实现文本框的显示
其他一致,主要回调那里有一点不同。在发送信息那里直接使用回调函数替代了,而信号与槽这里就是发送信号,在对应调用的地方记得关联槽函数,其实就是和前面的回调函数的实现一样。
参考文章
- Qt之回调函数:6 在QT中使用回调函数替代信号槽:https://blog.csdn.net/hitzsf/article/details/117693472
- Qt Creator 中 ui 文件和 Qt 代码关系:https://blog.csdn.net/fuhanghang/article/details/123530321