【QT】QT中的軟鍵盤設計

QT的軟鍵盤設計

  • 1.軟鍵盤制作步驟
  • 2.介紹有關函數的使用
  • 3.出現的編譯錯誤及解決辦法
    • 示例代碼1:按鍵事件實現軟鍵盤
    • 現象:
    • 示例代碼2:按鍵事件實現軟鍵盤(加特殊按鍵)
    • 現象:
  • 軟鍵盤移植到新的工程的步驟:
  • 自定義軟鍵盤設計步驟:圖示

QT中右鍵提升一個組件:作用就是把這個組件的類型變成提升之后的新類型,若程序員自己想要自定義實現某個控件的功能,就可用該功能

1.軟鍵盤制作步驟

第一步:在QT工程中新添加一個軟鍵盤的ui(模板選擇QWidget),并布局好軟鍵盤的ui順便把按鈕的focusPolicy這個屬性改成noFocus(沒有鼠標焦點,鼠標光標不會在按鈕上停留)
第二步:在你的主窗口中拖一個widget(等一會軟鍵盤嵌套到這個widget中來顯示的),右鍵點擊widget,選擇提升為剛才新建的軟鍵盤類
第三步:實現軟鍵盤的代碼邏輯(讓軟鍵盤可以使用)思路一:使用傳統的方法,信號與槽(很麻煩)思路二:使用QT中的按鍵事件來實現軟鍵盤在QT工程新增一個mybutton的類繼承QPushButton(按鈕類),關聯信號與槽函數,在槽函數中實現按鍵的邏輯
第四步:mybutton里面的槽函數代碼如下//獲取信號的發送者QPushButton *p=qobject_cast<QPushButton *>(sender());QString str=p->text(); // 獲取按鈕的字面值//按照事件產生的流程去寫代碼//自定義一個按鍵事件QKeyEvent *keyevent=new QKeyEvent(QEvent::KeyPress,str.toInt()-32,Qt::NoModifier,str);//把這個按鍵事件發送出去--》發送個鼠標光標聚集的組件QCoreApplication::postEvent(QApplication::focusWidget(),keyevent);

2.介紹有關函數的使用

QKeyEvent::QKeyEvent(Type type, int key, Qt::KeyboardModifiers modifiers, const QString &text = QString())參數: type --》事件類型  QEvent::KeyPresskey --》按鍵的鍵值 摸索規律:字母按鍵(無論大小寫)鍵值  A/a   65B/b   66modifiers --》你是否使用了某個組合鍵Qt::NoModifier  //沒有使用組合鍵Qt::ShiftModifier  //使用了shift按鍵text --》點擊的按鍵的字面值
//把指定的事件發送出去
[static] void QCoreApplication::postEvent(QObject *receiver, QEvent *event)參數:receiver --》事件的接收者event --》要發送的某種事件
//鼠標的光標停留在哪個組件上,該函數立馬返回這個組件的地址
[static] QWidget *QApplication::focusWidget()  //返回鼠標光標聚集的組件

3.出現的編譯錯誤及解決辦法

第一個:QObject::connect: No such slot QPushButton::fun() in ..\solfkeydemo\mybutton.cpp:6原因:你的mybutton這個類中使用了信號與槽,忘記添加Q_OBJECT這個宏定義了解決方法:在mybutton的頭文件中把Q_OBJECT這個宏定義加上即可
第二個:C:\Users\PC\Desktop\share\solfkeydemo\mybutton.cpp:3: error: undefined reference to `vtable for mybutton'解決方法:把編譯產生的臨時文件全部刪除,重新打開工程,再次編譯   

示例代碼1:按鍵事件實現軟鍵盤

當前目錄結構:
在這里插入圖片描述

// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};
#endif // WIDGET_H// widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);qDebug()<<"Widget::Widget 構造";
}Widget::~Widget()
{delete ui;
}
//=======================================================//
// soft_keyboard.h
#ifndef SOFT_KEYBOARD_H
#define SOFT_KEYBOARD_H#include <QWidget>
#include <QDebug>namespace Ui {
class soft_keyboard;
}class soft_keyboard : public QWidget
{Q_OBJECTpublic:explicit soft_keyboard(QWidget *parent = nullptr);~soft_keyboard();private:Ui::soft_keyboard *ui;
};#endif // SOFT_KEYBOARD_H// soft_keyboard.cpp
#include "soft_keyboard.h"
#include "ui_soft_keyboard.h"soft_keyboard::soft_keyboard(QWidget *parent) :QWidget(parent),ui(new Ui::soft_keyboard)
{ui->setupUi(this);qDebug()<<"soft_keyboard::soft_keyboard 構造";
}soft_keyboard::~soft_keyboard()
{delete ui;
}
//=======================================================//
// custom_button.h
#ifndef CUSTOM_BUTTON_H
#define CUSTOM_BUTTON_H#include <QPushButton>
#include <QDebug>
#include <QCoreApplication>
#include <QKeyEvent>
#include <QApplication>class custom_button : public QPushButton
{Q_OBJECT
public:explicit custom_button(QWidget *parent = nullptr);private slots:void func();
};#endif // CUSTOM_BUTTON_H// custom_button.cpp
#include "custom_button.h"custom_button::custom_button(QWidget *parent) : QPushButton(parent)
{qDebug()<<"custom_button 構造";connect(this, &QPushButton::clicked, this, &custom_button::func);
//    connect(this, SIGNAL(clicked()), this, SLOT(func()));
}void custom_button::func()
{//獲取信號的發送者QPushButton *p=qobject_cast<QPushButton *>(sender());QString str=p->text(); // 獲取按鈕的字面值
#if 0if (!str.isEmpty()) {QChar ch = str.at(0);int key = ch.toUpper().unicode(); // 獲取大寫字符的鍵值QKeyEvent *keyevent = new QKeyEvent(QEvent::KeyPress,key,Qt::NoModifier,QString(ch));QCoreApplication::postEvent(QApplication::focusWidget(), keyevent);}
#else//按照事件產生的流程寫代碼//自定義一個按鍵事件QKeyEvent *keyevent=new QKeyEvent(QEvent::KeyPress,str.toInt() - 32,Qt::NoModifier,str);//把這個按鍵事件發送出去--》發送給鼠標光標聚集的組件QCoreApplication::postEvent(QApplication::focusWidget(),keyevent);
#endif
}

現象:

請添加圖片描述

示例代碼2:按鍵事件實現軟鍵盤(加特殊按鍵)

與示例代碼1的差別是在槽函數中增加了特殊按鍵的判斷


// custom_button.h
#ifndef CUSTOM_BUTTON_H
#define CUSTOM_BUTTON_H#include <QPushButton>
#include <QDebug>
#include <QCoreApplication>
#include <QKeyEvent>
#include <QApplication>class custom_button : public QPushButton
{Q_OBJECT
public:explicit custom_button(QWidget *parent = nullptr);private slots:void func();
};#endif // CUSTOM_BUTTON_H// custom_button.cpp
#include "custom_button.h"custom_button::custom_button(QWidget *parent) : QPushButton(parent)
{qDebug()<<"custom_button 構造";connect(this, &QPushButton::clicked, this, &custom_button::func);
//    connect(this, SIGNAL(clicked()), this, SLOT(func()));
}void custom_button::func()
{//獲取信號的發送者QPushButton *p=qobject_cast<QPushButton *>(sender());QString str=p->text(); // 獲取按鈕的字面值
#if 0if (!str.isEmpty()) {QChar ch = str.at(0);int key = ch.toUpper().unicode(); // 獲取大寫字符的鍵值QKeyEvent *keyevent = new QKeyEvent(QEvent::KeyPress,key,Qt::NoModifier,QString(ch));QCoreApplication::postEvent(QApplication::focusWidget(), keyevent);}
#else//按照事件產生的流程寫代碼QKeyEvent *keyevent;//判斷特殊按鍵if(str=="Backspace") //退格鍵{//自定義一個按鍵事件keyevent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Backspace,Qt::NoModifier,str);}else if(str=="Enter"){//自定義一個按鍵事件keyevent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Enter,Qt::NoModifier,str);}else if(str==""){//自定義一個按鍵事件keyevent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Space,Qt::NoModifier," ");}else //字母按鍵{//自定義一個按鍵事件keyevent=new QKeyEvent(QEvent::KeyPress,str.toInt()-32,Qt::NoModifier,str);}//把這個按鍵事件發送出去--》發送給鼠標光標聚集的組件QCoreApplication::postEvent(QApplication::focusWidget(),keyevent);
#endif
}

現象:

請添加圖片描述

軟鍵盤移植到新的工程的步驟:

1.將已實現的功能代碼copy到新工程目錄下
在這里插入圖片描述
2.在工程文件名下右鍵—》添加現有文件
在這里插入圖片描述
3.選擇第一步copy過去的文件進行添加

在這里插入圖片描述4.在新工程中設計界面,將widget類提升為自定義的軟鍵盤類

在這里插入圖片描述

5.編譯后即可使用
請添加圖片描述

自定義軟鍵盤設計步驟:圖示

1.先在主窗口設計好界面,此時可以看到widget的類為QWidget(這個widget就是用來存放軟件的)
在這里插入圖片描述

2.新建一個UI界面用來設計軟鍵盤(添加新的設計師界面類)
在這里插入圖片描述
3.右鍵widget控件,選擇提升為…,將該widget提升為上一步自定義的軟鍵盤界面類

在這里插入圖片描述
4.填寫提升的類名稱,如下
在這里插入圖片描述
5.此時可以看到已將widget提升為自定義的軟鍵盤類
在這里插入圖片描述
7.編譯后也可以看到已經顯示到主窗口
在這里插入圖片描述
7.新建一個C++類,使其繼承自QPushButton (用來實現軟鍵盤的功能)

在這里插入圖片描述
8.將軟鍵盤界面的按鈕類提升為新建的C++類,此時該軟鍵盤界面使用的就是該類寫好的功能
在這里插入圖片描述
9.將焦點策略改為不聚焦,這樣在點擊按鈕時,此時的焦點就不是是按鈕,而是單行輸入框,這樣就可以根據新建的C++類寫好的事件進行處理
在這里插入圖片描述
9.在新建的custom_button類(這里是上邊提到的新建的C++類)中關聯信號與槽函數,在槽函數中實現按鍵的邏輯

#include "custom_button.h"custom_button::custom_button(QWidget *parent) : QPushButton(parent)
{qDebug()<<"custom_button 構造";connect(this, &QPushButton::clicked, this, &custom_button::func);
//    connect(this, SIGNAL(clicked()), this, SLOT(func()));
}void custom_button::func()
{//獲取信號的發送者QPushButton *p=qobject_cast<QPushButton *>(sender());QString str=p->text(); // 獲取按鈕的字面值qDebug()<<"str.toInt():"<<str.toInt();//按照事件產生的流程寫代碼//自定義一個按鍵事件  str.toInt()-32 :輸入按鈕字面值的ASCII 值 -32 如輸入a:即鍵值是97-32QKeyEvent *keyevent=new QKeyEvent(QEvent::KeyPress,str.toInt() - 32,Qt::NoModifier,str);//把這個按鍵事件發送出去--》發送個鼠標光標聚集的組件QCoreApplication::postEvent(QApplication::focusWidget(),keyevent);
}

11.現象如下
請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79528.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【LaTeX+VSCode本地Win11編譯教程】

LaTeXVSCode本地編譯教程參考視頻&#xff1a; LaTeXVSCode本地編譯教程 下面提供一種Win11的Latex環境配置和設置方案&#xff0c;首先vscode安裝參考博客&#xff1a;【VscodeGit教程】&#xff0c;然后準備安裝Latex相關組件 在 https://miktex.org/download 下載 miktex 并…

2025五一杯數學建模ABC題賽題已出

2025五一杯數學建模ABC題賽題已出 A: B: C:

Springclound常用五大組件及其使用原理

注冊中心Eureka Eureka-Server&#xff1a;就是服務注冊中心&#xff08;可以是一個集群&#xff09;&#xff0c;對外暴露自己的地址。 提供者&#xff1a;啟動后向Eureka注冊自己信息&#xff08;地址&#xff0c;服務名稱等&#xff09;&#xff0c;并且定期進行服務續約 …

Docker —— 隔離的基本操作(2)

Docker —— 隔離的基本操作&#xff08;2&#xff09; unshareunshare 命令詳解基本語法常用選項常用示例實際應用場景注意事項與 Docker 的關系1. 執行命令2. 修改主機名3. 退出命名空間4. 驗證宿主機主機名關鍵原理類比 Docker 容器總結 實戰操作一&#xff08;PID 隔離&…

Java List分頁工具

PageUtil.java import com.google.common.collect.Lists; import com.jd.platform.hotkey.dashboard.common.domain.Page; import org.springframework.util.CollectionUtils;import java.util.ArrayList; import java.util.List;public class PageUtil {/*** 通用分頁工具類*…

中陽策略:如何從K線行為中提取交易邏輯信號?

中陽策略&#xff1a;如何從K線行為中提取交易邏輯信號&#xff1f; 在量化趨勢研究中&#xff0c;中陽形態常被視作市場動能變化的重要標志。它不僅代表價格的強勢上行&#xff0c;更隱含著主力資金換手與情緒轉換的信號。將“中陽”這一結構元素抽象為模型中的“強動能突破”…

Java SE(8)——繼承

1.繼承的概念&作用 在Java中&#xff0c;繼承是面向對象編程的三大基本特性之一&#xff08;還有封裝和多態&#xff09;&#xff0c;允許一個類&#xff08;子類/繼承類&#xff09;繼承另一個類&#xff08;父類/基類&#xff09;的屬性和方法 繼承的核心目的是&#xf…

Python爬蟲(18)反爬攻防戰:動態IP池構建與代理IP實戰指南(突破95%反爬封禁率)

目錄 引言一、背景&#xff1a;為什么代理IP是爬蟲的“第二生命”&#xff1f;1.1 反爬系統的IP檢測三把刀1.2 代理IP的核心價值 二、基礎實戰&#xff1a;快速搭建代理IP系統2.1 免費代理IP的獲取與篩選2.2 代理IP的智能容錯機制 三、高階攻防&#xff1a;突破企業級反爬封鎖3…

LFU算法解析

文章目錄 LFU緩存中關鍵變量的訪問與更新機制1. min_freq - 最小頻率訪問時機更新時機更新示例 2. capacity - 緩存容量訪問時機更新時機訪問示例 3. key_to_node - 鍵到節點的映射訪問時機更新時機更新示例 4. freq_to_dummy - 頻率到鏈表啞節點的映射訪問時機更新時機更新示例…

ByteArrayInputStream 類詳解

ByteArrayInputStream 類詳解 ByteArrayInputStream 是 Java 中用于從字節數組讀取數據的輸入流&#xff0c;位于 java.io 包。它允許將內存中的字節數組當作輸入流來讀取&#xff0c;是處理內存數據的常用工具。 1. 核心特性 內存數據源&#xff1a;從字節數組&#xff08;b…

rvalue引用()

一、先確定基礎:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明確內存地址的表達式,可以取地址。比如變量名、引用等。 復制代碼 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吳恩達深度學習作業 RNN模型——字母級語言模型

一. 簡單復習一下RNN RNN RNN適用于處理序列數據&#xff0c;令是序列的第i個元素&#xff0c;那么就是一個長度為的序列&#xff0c;NLP中最常見的元素是單詞&#xff0c;對應的序列是句子。 RNN使用同一個神經網絡處理序列中的每一個元素。同時&#xff0c;為了表示序列的…

基于python的哈希查表搜索特定文件

Python有hashlib庫&#xff0c;支持多種哈希算法&#xff0c;比如MD5、SHA1、SHA256等。通常SHA256比較安全&#xff0c;但MD5更快&#xff0c;但可能存在碰撞風險&#xff0c;得根據自己需求決定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…

idea創建springboot項目無法創建jdk8原因及多種解決方案

idea創建springboot項目無法創建jdk8原因及多種解決方案 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是springboot的使用。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&#x…

【C++進階十】多態深度剖析

【C進階十】多態深度剖析 1.多態的概念及條件2.虛函數的重寫3.重寫、重定義、重載區別4.C11新增的override 和final5.抽象類6.虛表指針和虛表6.1什么是虛表指針6.2指向誰調用誰&#xff0c;傳父類調用父類&#xff0c;傳子類調用子類 7.多態的原理8.單繼承的虛表狀態9.多繼承的…

面向網絡安全的開源 大模型-Foundation-Sec-8B

1. Foundation-Sec-8B 整體介紹 Foundation-Sec-8B 是一個專注于網絡安全領域的大型語言模型 (LLM),由思科的基礎人工智能團隊 (Foundation AI) 開發 。它基于 Llama 3.1-8B 架構構建,并通過在一個精心策劃和整理的網絡安全專業語料庫上進行持續預訓練而得到增強 。該模型旨在…

Python爬蟲的基礎用法

Python爬蟲的基礎用法 python爬蟲一般通過第三方庫進行完成 導入第三方庫&#xff08;如import requests &#xff09; requests用于處理http協議請求的第三方庫,用python解釋器中查看是否有這個庫&#xff0c;沒有點擊安裝獲取網站url&#xff08;url一定要解析正確&#xf…

WHAT - Tailwind CSS + Antd = MetisUI組件庫

文章目錄 Tailwind 和 Antd 組件庫MetisUI 組件庫 Tailwind 和 Antd 組件庫 在 WHAT - Tailwind 樣式方案&#xff08;不寫任何自定義樣式&#xff09; 中我們介紹了 Tailwind&#xff0c;至于 Antd 組件庫&#xff0c;我們應該都耳熟能詳&#xff0c;官網地址&#xff1a;htt…

Day 4:牛客周賽Round 91

好久沒寫了&#xff0c;問題還蠻多的。聽說這次是苯環哥哥出題 F題 小苯的因子查詢 思路 考慮求因子個數&#xff0c;用質因數分解&#xff1b;奇數因子只需要去掉質數為2的情況&#xff0c;用除法。 這里有個比較妙的細節是&#xff0c;提前處理出數字x的最小質因數&#xff0…

使用直覺理解不等式

問題是這個&#xff1a; 題目 探究 ∣ max ? b { q 1 ( z , b ) } ? max ? b { q 2 ( z , b ) } ∣ ≤ max ? b ∣ q 1 ( z , b ) ? q 2 ( z , b ) ∣ |\max_b\{q_1(z,b)\}-\max_b\{q_2(z,b)\}|\le\max_b|q_1(z,b)-q_2(z,b)| ∣maxb?{q1?(z,b)}?maxb?{q2?(z,b)}∣≤…