统计局网站建设情况,免费咨询男性问题,广州微信网站建设,网站建设费用折旧年限最近在做项目时#xff0c;遇到一个问题#xff1a;在统信UOS系统编写的QT程序#xff0c;其中进入某些页面时#xff0c;或者显示模态窗时#xff0c;按钮都会有一个焦点框#xff0c;这个是不允许的#xff0c;于是乎#xff0c;开始了清理焦点的旅途。 一、清理QDia…最近在做项目时遇到一个问题在统信UOS系统编写的QT程序其中进入某些页面时或者显示模态窗时按钮都会有一个焦点框这个是不允许的于是乎开始了清理焦点的旅途。 一、清理QDialog::exec()调用时的所有焦点 可以看到“确定”按钮确实有个黑色的方框这个就是焦点框即当前窗口的焦点落到了“确定”按钮上。注意这个是自定义类继承自QDialog自己实现的模态 如果需要解决此问题可以使用 事件过滤器 当监听到窗口部件有焦点时取消之。
注意此方法必须自定义类继承自QDialog否则无法实现。 第一步继承自QDialog
class MyDialog : public QDialog {}
第二步重新实现 事件过滤器
bool eventFilter(QObject *obj, QEvent *event) override {// 省略一万行代码...
}
第三步为部件安装事件过滤器
widget-installEventFilter(this); 代码实现
#include QDialog
#include QEvent
#include QWidget
#include QApplicationclass MyDialog : public QDialog {Q_OBJECTpublic:MyDialog(QWidget *parent nullptr) : QDialog(parent) {/// 为对话框中的所有子部件安装事件过滤器foreach (QWidget *widget, this-findChildrenQWidget*()) {widget-installEventFilter(this);}}protected:// 重载事件过滤器bool eventFilter(QObject *obj, QEvent *event) override {/// 当部件获得焦点时清除焦点if (event-type() QEvent::FocusIn) {QWidget *widget qobject_castQWidget*(obj);if (widget) {widget-clearFocus(); // 清除焦点}}/// 继续处理其他事件return QDialog::eventFilter(obj, event);}
};// 主函数
int main(int argc, char *argv[]) {QApplication app(argc, argv);MyDialog dialog;dialog.exec(); // 执行对话框return app.exec();
}到此问题已解决 二、清除所有部件及子部件的焦点
问题也是与第一点一致按钮上有焦点时会显示一个黑色的焦点框。 解决代码
// 清除部件即所有子部件的焦点
void clearFocusForAllChildren(QWidget *widget)
{if (nullptr widget) {return;}// 获得当前部件的所有子部件QListQWidget* children widget-findChildrenQWidget*();for (QWidget* child : children) {if (child) {child-clearFocus();}clearFocusForAllChildren(child); // 递归调用}
} 完