[Qt學(xué)習(xí)筆記](méi)使用鍵盤(pán)事件實(shí)現(xiàn)ESC鍵退出Halcon的繪圖流程

1、介紹

Halcon中的執(zhí)行繪圖算子draw_circlr或draw_rectangle1等算子在繪制圖形時(shí)营密,單擊鼠標(biāo)左鍵進(jìn)行繪圖划址,點(diǎn)擊右鍵確認(rèn)圖形劲妙,點(diǎn)擊右鍵之前就進(jìn)行等待動(dòng)作呢岗,但是在MFC/Qt等開(kāi)發(fā)環(huán)境下冕香,無(wú)法通過(guò)操作退出Halcon的進(jìn)程。如果想在繪圖的中途取消后豫,目前沒(méi)有比較直接的方法悉尾。


介紹.PNG

Halcon介紹文檔里只是提到通過(guò)鼠標(biāo)右鍵結(jié)束繪圖動(dòng)作,在MacOS上可以使用escape鍵進(jìn)行退出挫酿。

2构眯、方法分析

由Halcon的幫助文檔可知,點(diǎn)擊鼠標(biāo)右鍵才能結(jié)束繪圖動(dòng)作早龟,那我們可以結(jié)合Qt的鍵盤(pán)事件鸵赖,Esc觸發(fā)后模擬右鍵后再將繪圖的操作和顯示恢復(fù)到繪圖前狀態(tài),這樣就大概能實(shí)現(xiàn)取消繪圖的效果拄衰。
其中鍵盤(pán)事件可以這樣來(lái)定義:

    //聲明鍵盤(pán)事件
    void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE;

然后在鍵盤(pán)事件實(shí)現(xiàn)中對(duì)鍵盤(pán)輸入進(jìn)行判斷:

    if(event->key() == Qt::Key_Escape)
    {
        if(isQuitDraw == 0){
            isQuitDraw = 1;
            //獲取控件的鼠標(biāo)位置
            int btnPosX = ui->PicShow->mapToGlobal(QPoint(0, 0)).x();
            int btnPosY = ui->PicShow->mapToGlobal(QPoint(0, 0)).y();
            qDebug()<<"控件坐標(biāo)"<<btnPosX<<btnPosY;
            //將鼠標(biāo)移動(dòng)到指定位置
            SetCursorPos(btnPosX+100,btnPosY+100);
            //模擬鼠標(biāo)的按下和放松動(dòng)作
            mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
            Sleep(2);
            mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
            //刷新圖像窗口,恢復(fù)繪圖變量
            UpdateWindowImg();
            ui->PicShow->m_IsDraw = false;
            SetMaskWidget(maskSignal);
        }
    }
    else if(event->key() == Qt::Key_Space)
    {
        qDebug()<<"按下空格"<<endl;
        return;
    }
    else QWidget::keyPressEvent(event);

這里碰到兩個(gè)問(wèn)題點(diǎn):

1.在繪圖動(dòng)作外按下Esc鍵觸發(fā)鍵盤(pán)事件

因?yàn)槔L圖動(dòng)作取消會(huì)有界面的重置等一系列動(dòng)作饵骨,所以在不繪圖時(shí)如果點(diǎn)擊了Esc按鍵可能會(huì)出現(xiàn)無(wú)操作翘悉,這里設(shè)定了一個(gè)isQuitDraw 的bool判斷量,在每次繪圖前開(kāi)啟居触,這樣就可以保證只能在繪圖的時(shí)候點(diǎn)擊Esc按鍵才能觸發(fā)取消繪圖動(dòng)作的代碼妖混。

2.系統(tǒng)自帶的鍵盤(pán)事件會(huì)干擾到鍵盤(pán)事件的執(zhí)行

在不設(shè)定鍵盤(pán)事件時(shí),系統(tǒng)有默認(rèn)的鍵盤(pán)事件轮洋,比如Esc是返回制市,Enter是確認(rèn),Tab是下一個(gè)等等弊予,因?yàn)橄到y(tǒng)設(shè)定的是默認(rèn)過(guò)濾事件event過(guò)濾事件進(jìn)行分發(fā)祥楣,所以我們?cè)谠O(shè)定了鍵盤(pán)事件后,系統(tǒng)的event依然會(huì)有對(duì)應(yīng)響應(yīng)動(dòng)作,這里有兩種解決方法误褪,一種是重寫(xiě)事件過(guò)濾器 bool eventFilter(QObject* obj, QEvent* e)责鳍,然后給圖像顯示的控件安裝事件過(guò)濾器。另一種方法就是重寫(xiě)reject兽间。
重寫(xiě)事件過(guò)濾器

#include <QKeyEvent>
 
class MyEventFilter : public QObject {
public:
    bool eventFilter( QObject *obj, QEvent *event ) override {
        if ( event->type() == QEvent::KeyPress ||
            event->type() == QEvent::KeyRelease ) {
            if ( ( (QKeyEvent *) event )->key() == Qt::Key_Space ) {
                qDebug("Space press!");
                return true;
            }
        }
        return false;
    }
};

完成對(duì)事件過(guò)濾器的重寫(xiě)后历葛,需要在需要攔截的頁(yè)面進(jìn)行安裝,如果是在子頁(yè)面(子進(jìn)程)中進(jìn)行安裝嘀略,那么它只在當(dāng)前頁(yè)面生效恤溶,并不會(huì)影響到別的頁(yè)面,如果想在全局使用帜羊,那么就需要在第一個(gè)基頁(yè)面中安裝咒程。安裝是調(diào)用QObject類(lèi)中的一個(gè)方法。

全局過(guò)濾這個(gè)鍵盤(pán)事件:

  QApplication a(argc, argv);
  a.installEventFilter(new MyEventFilter);

全局過(guò)濾后點(diǎn)擊Space鍵就不會(huì)有其他動(dòng)作逮壁,也不會(huì)進(jìn)入重寫(xiě)的鍵盤(pán)事件中孵坚,實(shí)現(xiàn)了屏蔽鍵盤(pán)按鍵的功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窥淆,一起剝皮案震驚了整個(gè)濱河市卖宠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忧饭,老刑警劉巖扛伍,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異词裤,居然都是意外死亡刺洒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)吼砂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逆航,“玉大人,你說(shuō)我怎么就攤上這事渔肩∫蚶” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵周偎,是天一觀的道長(zhǎng)抹剩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蓉坎,這世上最難降的妖魔是什么澳眷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮蛉艾,結(jié)果婚禮上钳踊,老公的妹妹穿的比我還像新娘衷敌。我一直安慰自己,他們只是感情好箍土,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布逢享。 她就那樣靜靜地躺著,像睡著了一般吴藻。 火紅的嫁衣襯著肌膚如雪瞒爬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天沟堡,我揣著相機(jī)與錄音侧但,去河邊找鬼。 笑死航罗,一個(gè)胖子當(dāng)著我的面吹牛禀横,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粥血,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柏锄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了复亏?” 一聲冷哼從身側(cè)響起趾娃,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缔御,沒(méi)想到半個(gè)月后抬闷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耕突,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年笤成,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眷茁。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炕泳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出上祈,到底是詐尸還是另有隱情喊崖,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布雇逞,位于F島的核電站,受9級(jí)特大地震影響茁裙,放射性物質(zhì)發(fā)生泄漏塘砸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一晤锥、第九天 我趴在偏房一處隱蔽的房頂上張望掉蔬。 院中可真熱鬧廊宪,春花似錦、人聲如沸女轿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛉迹。三九已至傅寡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間北救,已是汗流浹背荐操。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珍策,地道東北人托启。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像攘宙,于是被迫代替她去往敵國(guó)和親屯耸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1蹭劈、Qt使用QKeyEvent類(lèi)來(lái)描述與鍵盤(pán)有關(guān)的信息疗绣,比如按下或釋放鍵的代碼,使用枚舉類(lèi)型QEvent::Typ...
    379755b27396閱讀 1,866評(píng)論 0 0
  • 參考:Events and signals in PyQt5 所有的應(yīng)用都是事件驅(qū)動(dòng)的链方。事件大部分都是由用戶(hù)的行為...
    水之心閱讀 1,840評(píng)論 1 1
  • 鍵盤(pán)上的每個(gè)鍵的作用 肯定有你不知道的吧發(fā)布者:admin 發(fā)布時(shí)間:2008-6-18 11:48:10閱讀: ...
    jxowltlnwc閱讀 308評(píng)論 0 0
  • Qt筆記總結(jié) 作者:hackett 微信公眾號(hào):加班猿 一持痰、常用控件 按鈕類(lèi) QPushButton QtoolB...
    加班猿閱讀 577評(píng)論 0 1
  • 1、Qt中的事件 Qt中祟蚀,事件作為一個(gè)對(duì)象工窍,繼承自QEvent類(lèi),常見(jiàn)的有鍵盤(pán)事件QKeyEvent前酿、鼠標(biāo)事件QM...
    xixiaxi閱讀 526評(píng)論 0 1