qt编写触摸事件的关键
提要
無論你的電腦是支持觸摸屏,還是你通過usb外部連接觸摸屏,都能驗證你的觸摸程序功能。下面說說程序中使用觸摸按鈕等。
示例
按鈕可以實現觸摸功能
只需要在該按鈕所在的對話框的構造函數中添加下面一句:
setAttribute(Qt::WA_AcceptTouchEvents);//支持多點觸控使用的是控件自身的事件,比如按鈕的clicked槽函數,添加上面的支持觸控后,觸摸點擊按鈕后就會執行槽函數相應的操作。
自動義控件可以實現觸摸按下拖動
同樣需要在其構造函數中添加設置支持多點觸控的屬性;
setAttribute(Qt::WA_AcceptTouchEvents);//支持多點觸控然后在需要拖動的控件的類中重寫鼠標的按下,移動,釋放事件。
//相關變量定義QPoint m_beginPos;//鼠標點擊的起始位置QPoint m_leftTopPos;//窗口左上角的位置bool m_isTitle;//點擊的點是否在標題欄上void configBtnNameDialog::mousePressEvent(QMouseEvent *event) {if(event->button() == Qt::LeftButton){//在標題欄中點擊if(ui->widgetTitle->rect().contains(event->pos()))//注意此時使用pos()而不能使用globalPos(){m_beginPos = event->globalPos();//剛開始按下點的坐標m_leftTopPos = pos();//窗口左上角坐標m_isTitle = true;//是窗口標題欄}}QDialog::mousePressEvent(event); }void configBtnNameDialog::mouseMoveEvent(QMouseEvent *event) {if(event->buttons() == Qt::LeftButton && m_isTitle)//如果按下的是左鍵,且位置在標題欄上{QPoint endPos = event->globalPos();//結束點坐標QPoint offPos = endPos - m_beginPos;//結束點與開始點坐標差QPoint pos = m_leftTopPos + offPos;//左上角坐標加偏移量move(pos);//移動到該點}QDialog::mouseMoveEvent(event);//不可忘掉 }void configBtnNameDialog::mouseReleaseEvent(QMouseEvent *event) {m_isTitle = false;QDialog::mouseReleaseEvent(event); }其中ui->widgetTitle為自定義的標題欄。實際上這種事件的編寫,還是之前沒有觸摸屏時一樣的事件,只是添加了支持多點觸控的屬性,便可以手動觸摸拖動窗口標題欄。
觸摸長按出現對話框(也可以是其它控件)
在按鈕上長按幾秒出現對話框,由于是自定義的按鈕,所以需要在按鈕中重寫event事件,在event事件中實現長按出對話框。
同樣需要在其自定義的按鈕的構造函數中添加設置支持多點觸控的屬性;
下面是event函數的定義
//變量定義 bool m_isLongPress;//是否觸屏長按 int m_second = 0;//當前的秒數 QTime m_begintime;//開始長按的時間bool myButton::event(QEvent *event) {switch(event->type()){case QEvent::TouchBegin:{QTouchEvent* touch = static_cast<QTouchEvent*>(event);QList<QTouchEvent::TouchPoint> touchPoints = touch->touchPoints();outPut<<"myButton::event->TouchBegin點的個數為:"<<touchPoints.count();if(touchPoints.count() == 1){m_begintime = QTime::currentTime();m_second = m_begintime.hour()*3600+m_begintime.minute()*60+m_begintime.second();outPut<<"開始時間:"<<m_begintime<<"當前秒數:"<<m_second;m_isLongPress = true;}event->accept();}case QEvent::TouchUpdate:{QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);QList<QTouchEvent::TouchPoint> touchPoints = touchEvent->touchPoints();outPut<<"myButton::event->TouchUpdate點的個數為:"<<touchPoints.count();if (touchPoints.count() == 1){outPut<<"touchPoints.count() == 1";if(m_isLongPress){outPut<<"正在被按下";QTime current_time =QTime::currentTime();int secondEnd = current_time.hour()*3600+current_time.minute()*60+current_time.second();outPut<<"時間:"<<secondEnd;if(secondEnd - m_second >= 1){//長按2秒顯示設置名稱的對話框showEditNameDlg();outPut<<"長按顯示對話框"<<"起始時間:"<<m_begintime<<"終止時間:"<<current_time;}}}return true;}case QEvent::TouchEnd:{m_isLongPress = false;event->accept();outPut<<"釋放";return true;}default:break;}return QPushButton::event(event); }以上是觸摸長按出對話框,中間長按等待的時間可能會不一樣,有時很短的時間可以出對話框,有時很長一段時間才出對話框,究其原因是進入TouchUpdate的時間不一樣,如下面這樣,可以很快出對話框,因為檢測到了長按時間超過1秒。
2021-03-25 13:59:41 Debug:myButton::event [ 160 ] myButton::event->TouchBegin點的個數為: 1
2021-03-25 13:59:41 Debug:myButton::event [ 165 ] 開始時間: QTime(“13:59:41.356”) 當前秒數: 50381
2021-03-25 13:59:41 Debug:myButton::event [ 174 ] myButton::event->TouchUpdate點的個數為: 1
2021-03-25 13:59:41 Debug:myButton::event [ 177 ] touchPoints.count() == 1
2021-03-25 13:59:41 Debug:myButton::event [ 180 ] 正在被按下
2021-03-25 13:59:41 Debug:myButton::event [ 183 ] 時間: 50381
2021-03-25 13:59:55 Debug:myButton::event [ 174 ] myButton::event->TouchUpdate點的個數為: 1
2021-03-25 13:59:55 Debug:myButton::event [ 177 ] touchPoints.count() == 1
2021-03-25 13:59:55 Debug:myButton::event [ 180 ] 正在被按下
2021-03-25 13:59:55 Debug:myButton::event [ 183 ] 時間: 50395
2021-03-25 13:59:55 Debug:myButton::event [ 188 ] 長按顯示對話框 起始時間: QTime(“13:59:41.356”) 終止時間: QTime(“13:59:55.029”)
2021-03-25 13:59:55 Debug:myButton::event [ 198 ] 釋放
以上就可以通過觸摸屏長按很快顯示對話框,但是下面卻不是,中間需要一直等待程序再次進入TouchUpdate。甚至于一直長按觸摸屏,沒有釋放,程序也會檢測到已經釋放,輸出釋放信息。
2021-03-25 13:56:46 Debug:myButton::event [ 165 ] 開始時間: QTime(“13:56:46.032”) 當前秒數: 50206
2021-03-25 13:56:46 Debug:myButton::event [ 174 ] myButton::event->TouchUpdate點的個數為: 1
2021-03-25 13:56:46 Debug:myButton::event [ 177 ] touchPoints.count() == 1
2021-03-25 13:56:46 Debug:myButton::event [ 180 ] 正在被按下
2021-03-25 13:56:46 Debug:myButton::event [ 183 ] 時間: 50206
2021-03-25 13:56:47 Debug:myButton::event [ 198 ] 釋放
2021-03-25 13:51:34 Debug:myButton::event [ 160 ] myButton::event->TouchBegin點的個數為: 1
2021-03-25 13:51:34 Debug:myButton::event [ 165 ] 開始時間: QTime(“13:51:34.172”) 當前秒數: 49894
2021-03-25 13:51:34 Debug:myButton::event [ 175 ] myButton::event->TouchUpdate點的個數為: 1
2021-03-25 13:51:34 Debug:myButton::event [ 178 ] touchPoints.count() == 1
2021-03-25 13:51:34 Debug:myButton::event [ 181 ] 正在被按下
2021-03-25 13:51:34 Debug:myButton::event [ 186 ] 時間: 49894
2021-03-25 13:51:37 Debug:myButton::event [ 203 ] 釋放
但是功能上應該是正確的,可以實現長按觸摸屏出現對話框。
總結
1.添加設置觸摸屬性,setAttribute(Qt::WA_AcceptTouchEvents);;
常規的按鍵之類的可以直接實現。
2.復雜一點在event事件中實現相關功能。
注意:以上可能只適用于窗口,小控件,至于場景視圖這些不一定完全適用,還需做一些改動。
總結
以上是生活随笔為你收集整理的qt编写触摸事件的关键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字典 学生成绩等级_python-列表及
- 下一篇: 关于指针的小领悟