SoftNumKeyboardWidget.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. #include "softnumkeyboardwidget.h"
  2. #include <QMutex>
  3. #include <QApplication>
  4. #include <QTimer>
  5. #include <QLayout>
  6. #include <QLabel>
  7. #include <QTextEdit>
  8. #include <QLineEdit>
  9. #include "Windows.h"
  10. #include<QDebug>
  11. #pragma comment(lib, "user32.lib")
  12. /*
  13. *
  14. 示例1 外部编辑框点击弹起软键盘并移动窗口
  15. bool QModifyPasswordDialog::eventFilter(QObject *watched, QEvent *event)
  16. {
  17. if(watched == passwordEdit1){
  18. static QPoint point;
  19. switch (event->type()) {
  20. case QEvent::MouseButtonPress:
  21. point.setY(cursor().pos().y());
  22. qDebug()<<"i find it";
  23. HWND hw1 = ::FindWindowA(NULL, "数字软键盘");
  24. if(hw1==NULL)
  25. {
  26. QString dir = QCoreApplication::applicationDirPath();
  27. QProcess::startDetached(QString(dir+"//SoftNumKeyBoard.exe"));
  28. }
  29. RECT rc;
  30. GetWindowRect(hw1,&rc);
  31. ::MoveWindow(hw1,cursor().pos().x(),cursor().pos().y()+30,rc.right-rc.left,rc.bottom-rc.top,true);
  32. qDebug()<<hw1;
  33. break;
  34. }
  35. }
  36. return QDialog::eventFilter(watched, event);
  37. }
  38. 示例2 外部编辑框点击弹起软键盘并发送移动窗口命令
  39. bool QModifyPasswordDialog::eventFilter(QObject *watched, QEvent *event)
  40. {
  41. if(watched == passwordEdit1){
  42. static QPoint point;
  43. switch (event->type()) {
  44. case QEvent::MouseButtonPress:
  45. point.setY(cursor().pos().y());
  46. qDebug()<<"i find it";
  47. HWND hw1 = ::FindWindowA(NULL, "数字软键盘");
  48. if(hw1==NULL)
  49. {
  50. QString dir = QCoreApplication::applicationDirPath();
  51. QProcess::startDetached(QString(dir+"//SoftNumKeyBoard.exe"));
  52. Sleep(500);
  53. hw1 = ::FindWindowA(NULL, "数字软键盘");
  54. }
  55. ::PostMessageA(hw1,3000,cursor().pos().x(),cursor().pos().y()+30);
  56. qDebug()<<hw1;
  57. break;
  58. }
  59. }
  60. return QDialog::eventFilter(watched, event);
  61. }
  62. */
  63. SoftNumKeyboardWidget::SoftNumKeyboardWidget(QWidget *parent) : QWidget(parent)
  64. {
  65. resize(350, 350);
  66. initUI();
  67. initForm();
  68. LONG exs = GetWindowLong((HWND)this->winId(), GWL_EXSTYLE);
  69. exs |= 0x08000000;//始终不处于活动状态
  70. SetWindowLong((HWND)this->winId(),GWL_EXSTYLE, exs);
  71. //置顶
  72. SetWindowPos((HWND)this->winId(), HWND_TOPMOST, this->x(), this->y(), this->width(), this->height(), SWP_SHOWWINDOW);
  73. }
  74. SoftNumKeyboardWidget::~SoftNumKeyboardWidget()
  75. {
  76. }
  77. void SoftNumKeyboardWidget::initUI()
  78. {
  79. QGridLayout *gridLayout_3;
  80. //QHBoxLayout *lay2;
  81. //QLabel *labTitle;
  82. QGridLayout *gridLayout;
  83. QPushButton *btn3;
  84. QPushButton *btn5;
  85. QPushButton *btn6;
  86. QPushButton *btn7;
  87. QPushButton *btn8;
  88. QPushButton *btn9;
  89. QPushButton *btn0;
  90. QPushButton *btn4;
  91. QPushButton *btn1;
  92. QPushButton *btn2;
  93. QPushButton *btnDot;
  94. QSizePolicy sizePolicy1(QSizePolicy::Ignored, QSizePolicy::Expanding);
  95. sizePolicy1.setHorizontalStretch(0);
  96. sizePolicy1.setVerticalStretch(0);
  97. gridLayout_3 = new QGridLayout(this);
  98. gridLayout_3->setSpacing(0);
  99. gridLayout_3->setObjectName(QStringLiteral("gridLayout_3"));
  100. gridLayout_3->setContentsMargins(0, 0, 0, 0);
  101. // widgetTop = new QWidget(this);
  102. // widgetTop->setObjectName(QStringLiteral("widgetTop"));
  103. // widgetTop->setFixedHeight(40);
  104. // lay2 = new QHBoxLayout(widgetTop);
  105. // lay2->setSpacing(0);
  106. // lay2->setObjectName(QStringLiteral("lay2"));
  107. // lay2->setContentsMargins(0, 0, 0, 0);
  108. // labTitle = new QLabel(widgetTop);
  109. // labTitle->setObjectName(QStringLiteral("labTitle"));
  110. // labTitle->setAlignment(Qt::AlignLeft);
  111. // labTitle->setContentsMargins(10, 10, 0, 0);
  112. // lay2->addWidget(labTitle);
  113. // btnClose = new QPushButton(widgetTop);
  114. // btnClose->setObjectName(QStringLiteral("btnClose"));
  115. // btnClose->setFixedWidth(32);
  116. // btnClose->setFixedHeight(32);
  117. // btnClose->setFocusPolicy(Qt::NoFocus);
  118. // lay2->addWidget(btnClose);
  119. // gridLayout_3->addWidget(widgetTop, 0, 0, 1, 2);
  120. widgetMain = new QWidget(this);
  121. widgetMain->setObjectName(QStringLiteral("widgetMain"));
  122. QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Preferred);
  123. sizePolicy2.setHorizontalStretch(0);
  124. sizePolicy2.setVerticalStretch(0);
  125. sizePolicy2.setHeightForWidth(widgetMain->sizePolicy().hasHeightForWidth());
  126. widgetMain->setSizePolicy(sizePolicy2);
  127. gridLayout = new QGridLayout(widgetMain);
  128. gridLayout->setObjectName(QStringLiteral("gridLayout"));
  129. btn7 = new QPushButton(widgetMain);
  130. btn7->setObjectName(QStringLiteral("btn7"));
  131. sizePolicy1.setHeightForWidth(btn7->sizePolicy().hasHeightForWidth());
  132. btn7->setSizePolicy(sizePolicy1);
  133. btn7->setFocusPolicy(Qt::NoFocus);
  134. gridLayout->addWidget(btn7, 0, 0, 1, 1);
  135. btn8 = new QPushButton(widgetMain);
  136. btn8->setObjectName(QStringLiteral("btn8"));
  137. sizePolicy1.setHeightForWidth(btn8->sizePolicy().hasHeightForWidth());
  138. btn8->setSizePolicy(sizePolicy1);
  139. btn8->setFocusPolicy(Qt::NoFocus);
  140. gridLayout->addWidget(btn8, 0, 1, 1, 1);
  141. btn9 = new QPushButton(widgetMain);
  142. btn9->setObjectName(QStringLiteral("btn9"));
  143. sizePolicy1.setHeightForWidth(btn9->sizePolicy().hasHeightForWidth());
  144. btn9->setSizePolicy(sizePolicy1);
  145. btn9->setFocusPolicy(Qt::NoFocus);
  146. gridLayout->addWidget(btn9, 0, 2, 1, 1);
  147. btn4 = new QPushButton(widgetMain);
  148. btn4->setObjectName(QStringLiteral("btn4"));
  149. sizePolicy1.setHeightForWidth(btn4->sizePolicy().hasHeightForWidth());
  150. btn4->setSizePolicy(sizePolicy1);
  151. btn4->setFocusPolicy(Qt::NoFocus);
  152. gridLayout->addWidget(btn4, 1, 0, 1, 1);
  153. btn5 = new QPushButton(widgetMain);
  154. btn5->setObjectName(QStringLiteral("btn5"));
  155. sizePolicy1.setHeightForWidth(btn5->sizePolicy().hasHeightForWidth());
  156. btn5->setSizePolicy(sizePolicy1);
  157. btn5->setFocusPolicy(Qt::NoFocus);
  158. gridLayout->addWidget(btn5, 1, 1, 1, 1);
  159. btn6 = new QPushButton(widgetMain);
  160. btn6->setObjectName(QStringLiteral("btn6"));
  161. sizePolicy1.setHeightForWidth(btn6->sizePolicy().hasHeightForWidth());
  162. btn6->setSizePolicy(sizePolicy1);
  163. btn6->setFocusPolicy(Qt::NoFocus);
  164. gridLayout->addWidget(btn6, 1, 2, 1, 1);
  165. btn1 = new QPushButton(widgetMain);
  166. btn1->setObjectName(QStringLiteral("btn1"));
  167. sizePolicy1.setHeightForWidth(btn1->sizePolicy().hasHeightForWidth());
  168. btn1->setSizePolicy(sizePolicy1);
  169. btn1->setFocusPolicy(Qt::NoFocus);
  170. gridLayout->addWidget(btn1, 2, 0, 1, 1);
  171. btn2 = new QPushButton(widgetMain);
  172. btn2->setObjectName(QStringLiteral("btn2"));
  173. sizePolicy1.setHeightForWidth(btn2->sizePolicy().hasHeightForWidth());
  174. btn2->setSizePolicy(sizePolicy1);
  175. btn2->setFocusPolicy(Qt::NoFocus);
  176. gridLayout->addWidget(btn2, 2, 1, 1, 1);
  177. btn3 = new QPushButton(widgetMain);
  178. btn3->setObjectName(QStringLiteral("btn3"));
  179. sizePolicy1.setHeightForWidth(btn3->sizePolicy().hasHeightForWidth());
  180. btn3->setSizePolicy(sizePolicy1);
  181. btn3->setFocusPolicy(Qt::NoFocus);
  182. gridLayout->addWidget(btn3, 2, 2, 1, 1);
  183. btn0 = new QPushButton(widgetMain);
  184. btn0->setObjectName(QStringLiteral("btn0"));
  185. sizePolicy1.setHeightForWidth(btn0->sizePolicy().hasHeightForWidth());
  186. btn0->setSizePolicy(sizePolicy1);
  187. btn0->setFocusPolicy(Qt::NoFocus);
  188. gridLayout->addWidget(btn0, 3, 0, 1, 1);
  189. btnDot = new QPushButton(widgetMain);
  190. btnDot->setObjectName(QStringLiteral("btnDot"));
  191. sizePolicy1.setHeightForWidth(btnDot->sizePolicy().hasHeightForWidth());
  192. btnDot->setSizePolicy(sizePolicy1);
  193. btnDot->setFocusPolicy(Qt::NoFocus);
  194. gridLayout->addWidget(btnDot, 3, 1, 1, 1);
  195. btnDelete = new QPushButton(widgetMain);
  196. btnDelete->setObjectName(QStringLiteral("btnDelete"));
  197. sizePolicy1.setHeightForWidth(btnDelete->sizePolicy().hasHeightForWidth());
  198. btnDelete->setSizePolicy(sizePolicy1);
  199. btnDelete->setFocusPolicy(Qt::NoFocus);
  200. gridLayout->addWidget(btnDelete, 3, 2, 1, 1);
  201. gridLayout_3->addWidget(widgetMain, 1, 1, 1, 1);
  202. //labTitle->setText(QString());
  203. btn0->setText("0");
  204. btn1->setText("1");
  205. btn2->setText("2");
  206. btn3->setText("3");
  207. btn4->setText("4");
  208. btn5->setText("5");
  209. btn6->setText("6");
  210. btn7->setText("7");
  211. btn8->setText("8");
  212. btn9->setText("9");
  213. btnDot->setText(".");
  214. btnDelete->setText(QString());
  215. this->setWindowTitle(QString::fromLocal8Bit("数字软键盘"));
  216. QList<QPushButton *> btns = widgetMain->findChildren<QPushButton *>();
  217. foreach (QPushButton *btn, btns) {
  218. connect(btn, SIGNAL(clicked()), this, SLOT(btnClicked()));
  219. }
  220. // btns = widgetTop->findChildren<QPushButton *>();
  221. // foreach (QPushButton *btn, btns) {
  222. // connect(btn, SIGNAL(clicked()), this, SLOT(btnClicked()));
  223. // }
  224. }
  225. void SoftNumKeyboardWidget::initForm()
  226. {
  227. setFrmSize(350, 350);
  228. //图标固定大小
  229. setIconSize(20, 20);
  230. //按钮之间的间隔
  231. setSpacing(6);
  232. //面板的样式
  233. setMainStyle();
  234. }
  235. void SoftNumKeyboardWidget::btnClicked()
  236. {
  237. //keybd_eve7nt(VK_F5,0,0,0);
  238. QPushButton *btn = (QPushButton *)sender();
  239. QString objectName = btn->objectName();
  240. if(objectName == "btnClose")
  241. {
  242. close();
  243. }
  244. if (objectName == "btnDelete")
  245. {
  246. deleteValue();
  247. }
  248. else {
  249. QString value = btn->text();
  250. insertValue(value);
  251. }
  252. }
  253. void SoftNumKeyboardWidget::insertValue(const QString &v)
  254. {
  255. QString value = v;
  256. int key = VK_NUMPAD0;
  257. if(v == ".")
  258. {
  259. key=110;
  260. }
  261. else
  262. key +=v.toInt();
  263. keybd_event(key,0,0,0);
  264. }
  265. void SoftNumKeyboardWidget::deleteValue()
  266. {
  267. keybd_event(VK_BACK,0,0,0);
  268. }
  269. void SoftNumKeyboardWidget::setFrmSize(int frmWidth, int frmHeight)
  270. {
  271. this->frmWidth = frmWidth;
  272. this->frmHeight = frmHeight;
  273. this->setMinimumSize(frmWidth, frmHeight);
  274. }
  275. void SoftNumKeyboardWidget::setIconSize(int iconWidth, int iconHeight)
  276. {
  277. QSize icoSize3(iconWidth + 3, iconHeight + 3);
  278. btnDelete->setIconSize(icoSize3);
  279. }
  280. void SoftNumKeyboardWidget::setSpacing(int spacing)
  281. {
  282. widgetMain->layout()->setSpacing(spacing);
  283. }
  284. void SoftNumKeyboardWidget::setMainStyle()
  285. {
  286. btnDelete->setIcon(QIcon(":/image/delete_white.png"));
  287. //btnClose->setIcon(QIcon(ThemeInfo::staticGetIcon("dock_close.png")));
  288. setColor("#191919", "#F3F3F3", "#313131", "#4189D3", "#F3F3F3", "#F95717", "#F3F3F3");
  289. }
  290. void SoftNumKeyboardWidget::setColor(const QString &mainBackgroundColor, const QString &mainTextColor, const QString &btnBackgroundColor,
  291. const QString &btnHoveColor, const QString &btnHoveTextColor, const QString &labHoveColor, const QString &labHoveTextColor)
  292. {
  293. QStringList qss;
  294. qss.append(QString("QWidget{background-color:%1;}").arg(mainBackgroundColor));
  295. qss.append(QString("QWidget#widgetTop,QWidget#widgetMain,QWidget#widgetNumber{background-color:%1;}").arg(mainBackgroundColor));
  296. qss.append(QString("QPushButton{border-width:0px;border-radius:3px;color:%1;}").arg(mainTextColor));
  297. qss.append(QString("QPushButton{padding:0px;background-color:%1;}").arg(btnBackgroundColor));
  298. qss.append(QString("QPushButton:pressed,QPushButton:hover{background-color:%1;color:%2;}").arg(btnHoveColor).arg(btnHoveTextColor));
  299. qss.append(QString("QLabel{border-width:0px;border-radius:3px;color:%1;background:none;}").arg(mainTextColor));
  300. //qss.append(QString("QLabel:pressed,QLabel:hover{background-color:%1;color:%2;}").arg(labHoveColor).arg(labHoveTextColor));
  301. //设置主样式
  302. this->setStyleSheet(qss.join(""));
  303. }
  304. bool SoftNumKeyboardWidget::nativeEvent(const QByteArray &eventType, void *message, long *result)
  305. {
  306. if (eventType == "windows_generic_MSG") //windows平台
  307. {
  308. MSG* msg = reinterpret_cast<MSG*>(message); //
  309. if(msg->message == 3000)//消息类型
  310. {
  311. move(msg->wParam,msg->lParam);
  312. return true;
  313. }
  314. }
  315. return QWidget::nativeEvent(eventType, message, result);//交给Qt处理
  316. }