要求
要求:**一个弹窗界面有多个弹窗以及按钮,现在主界面有上下左右按钮,同时还有鼠标点击
针对上下左右按钮,需要知道当前在哪个位置,往哪个方向移动,所以需要将页面中的控件统一起来
解决方案:设计一个结构,保存所有相关控件的指针,然后等待后续的上下左右
一、设置结构
布局中有QLineEdit、QComboBox、QPushButton等,可以设置成二维矩阵,另外设置一个当前光标位置focusedWidget用来追踪状态
1 | QVector<QVector<QWidget*>> grid; // 用于存储控件指针的二维数组 |
二、初始化结构,添加控件
将所有相关的控件都添加到QVector的二维结构之中,以便后续从此进行查找
1 | void SettingsDialog::initGrid() |
三、建立信号槽
建立信号槽,创建上下左右的实现函数
在主界面LKJ中实现connect
1 | connect(this, &LKJ::signalSettingsDialogUp, settingsDialog, &SettingsDialog::moveFocusUp); |
四、实现光标切换
以向下为例,判断当前控件指针focusedWidget如何变化
1 | void SettingsDialog::moveFocusDown() |
1.5、
这里发现一个问题,我设置的grid结构的光标指针与我鼠标点击的光标指针不同步,如何解决,
最后设想,在点击控件的时候,可以发出信号然后修改focusedWidget
可是,QLineEdit没有clicked,它的focusInEvent是一个虚拟函数,在获取焦点的时候,会调用此函数;所以在自定义控件CustomLineEdit中重写此函,发出customClicked()信号
注意:自定义控件文件需要是单独的.h或.cpp文件,不要把它加在其他文件中
1 |
|
1 |
|
1.6、
完成自定义控件customLineEdit的编写之后,需要对QLineEdit进行提升,将其变为CustomLineEdit类型
然后建立connect连接
1 | // 连接 customClicked 信号 |
1.7、
然后根据当前是什么控件,查找到对应的位置,更改光标
1 | void SettingsDialog::onEditBoxClicked(CustomLineEdit* edit) |
1.8、
同理,针对QComboBox,自定义控件,重写focusInEvent函数,发送信号,对Ui中的控件进行升级
1 |
|