下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第Qt鍵盤(pán)事件實(shí)現(xiàn)圖片在窗口上下左右移動(dòng)本文實(shí)例為大家分享了Qt鍵盤(pán)事件實(shí)現(xiàn)圖片在窗口上下左右移動(dòng),供大家參考,具體內(nèi)容如下
標(biāo)簽(空格分隔):鍵盤(pán)事件
一、項(xiàng)目?jī)?nèi)容:
新建桌面應(yīng)用程序testKeyEvent,類(lèi)名KeyEvent,基類(lèi)QWidget,通過(guò)重寫(xiě)鍵盤(pán)事件到達(dá)操作的鍵盤(pán)的時(shí)候窗口中的圖片上下左右移動(dòng),類(lèi)似QtCreator設(shè)計(jì)模式下通過(guò)按鍵擺放部件時(shí)的效果。
二、實(shí)現(xiàn)細(xì)節(jié)
keyevent.h內(nèi)容:
#ifndefKEYEVENT_H
#defineKEYEVENT_H
#includeQWidget
QT_BEGIN_NAMESPACE
namespaceUi{classkeyEvent;}
QT_END_NAMESPACE
classkeyEvent:publicQWidget
Q_OBJECT
public:
keyEvent(QWidget*parent=nullptr);
~keyEvent();
voiddrawPix();
//自定義成員函數(shù)用來(lái)在pixmap上繪制網(wǎng)格線和圖片
protected:
voidkeyPressEvent(QKeyEvent*event)override;
//重寫(xiě)鍵盤(pán)按下事件
voidpaintEvent(QPaintEvent*event)override;
//重寫(xiě)繪圖事件
private:
Ui::keyEvent*ui;
QPixmap*m_pix;
QImagem_image;
intm_startX;
//圖標(biāo)頂點(diǎn)的位置
intm_startY;
intm_width;
//界面的寬度和高度
intm_height;
intm_step;
//圖片移動(dòng)的步長(zhǎng)
#endif//KEYEVENT_H
構(gòu)造函數(shù):(初始化窗口大小、pximap、加載圖片、要顯示圖片左上角的坐標(biāo))
keyEvent::keyEvent(QWidget*parent)
:QWidget(parent)
,ui(newUi::keyEvent)
ui-setupUi(this);
setWindowTitle("鍵盤(pán)事件");
setAutoFillBackground(true);
setFixedSize(512,256);
m_width=size().width();
m_height=size().height();
m_pix=newQPixmap(m_width,m_height);
m_pix-fill(Qt::white);
m_image.load("../car.png");//當(dāng)前工作目錄默認(rèn)Debug目錄下,car.png在上一級(jí)目錄下
m_startX=100;
m_startY=100;
m_step=20;
drawPix();
}
drawPix():定義Painter對(duì)象,并設(shè)置畫(huà)筆(虛線),m_pix作為繪圖設(shè)備,在上面繪制網(wǎng)格虛線,還有圖片的位置信息
voidkeyEvent::drawPix()
m_pix-fill(Qt::white);
QPainterpainter(this);
QPenpen(Qt::DotLine);//虛線
painter.begin(m_pix);
//m_pix為繪圖設(shè)備
painter.setPen(pen);
//按照步長(zhǎng)畫(huà)縱向的網(wǎng)格虛線
for(inti=m_step;im_width;i+=m_step){
painter.drawLine(QPoint(i,0),QPoint(i,m_height));
}
//按照步長(zhǎng)畫(huà)橫向的網(wǎng)格虛線
for(intj=m_step;jm_height;j+=m_step){
painter.drawLine(QPoint(0,j),QPoint(m_width,j));
}
painter.end();
//畫(huà)圖片
painter.begin(m_pix);
painter.drawImage(QPoint(m_startX,m_startY),m_image);
painter.end();
}
重寫(xiě)鍵盤(pán)事件
1、按下Ctrl+方向鍵一次圖片移動(dòng)一個(gè)像素的距離
2、普通方向鍵一次移動(dòng)步長(zhǎng)(m_step:20像素)的距離,ui界面下默認(rèn)一次移動(dòng)10個(gè)像素
voidkeyEvent::keyPressEvent(QKeyEvent*event)
//按下ctrl鍵移動(dòng)一個(gè)像素
if(event-modifiers()==Qt::ControlModifier){
if(event-key()==Qt::Key_Left){
m_startX=(m_startX-1)0m_startX:m_startX-1;
}elseif(event-key()==Qt::Key_Right){
m_startX=(m_startX+1+m_image.width())m_widthm_startX:m_startX+1;
}elseif(event-key()==Qt::Key_Up){
m_startY=(m_startY-1)0m_startY:m_startY-1;
}elseif(event-key()==Qt::Key_Down){
m_startY=(m_startY+1+m_image.height())m_heightm_startY:m_startY+1;
}
}else{
//調(diào)整圖片左上角的位置到網(wǎng)格頂點(diǎn)
m_startX=m_startX+m_startX%m_step;
m_startY=m_startY+m_startY%m_step;
if(event-key()==Qt::Key_Left){
m_startX=(m_startX-m_step)0m_startX:m_startX-m_step;
}elseif(event-key()==Qt::Key_Right){
m_startX=(m_startX+m_step+m_image.width())m_widthm_startX:m_startX+m_step;
}elseif(event-key()==Qt::Key_Up){
m_startY=(m_startY-m_step)0m_startY:m_startY-m_step;
}elseif(event-key()==Qt::Key_Down){
m_startY=(m_startY+m_step+m_image.height())m_heightm_startY:m_startY+m_step;
}
}
drawPix();
//刷新圖片的位置
update();//觸發(fā)窗口重繪,執(zhí)行paintEvent();
}
重寫(xiě)QWidget類(lèi)繪制事件
繪制事件觸發(fā)的條件:(查閱Qt幫助文檔)
1、repaint()orupdate()wasinvoked,
2、thewidgetwasobscuredandhasnowbeenuncovered,or
3、manyotherreasons.
voidkeyEvent::pain
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南省衡陽(yáng)市常寧市2025-2026學(xué)年七年級(jí)上學(xué)期期末質(zhì)量監(jiān)測(cè)道德與法治試卷(含答案)
- 安徽省蚌埠市固鎮(zhèn)縣部分學(xué)校2025-2026學(xué)年九年級(jí)上學(xué)期1月期末數(shù)學(xué)試題答案
- 2025-2026學(xué)年山東煙臺(tái)長(zhǎng)島第二實(shí)驗(yàn)學(xué)校 九年級(jí)(上下冊(cè))期末道德與法治試卷(無(wú)答案)
- 五年級(jí)數(shù)學(xué)期末考試卷及答案
- 為民服務(wù)題庫(kù)及答案
- 網(wǎng)絡(luò)的題目及答案
- 初中數(shù)學(xué)培訓(xùn)
- 北京警察學(xué)院《Photoshop 圖像處理》2024 - 2025 學(xué)年第一學(xué)期期末試卷
- 2022~2023安全員考試題庫(kù)及答案第254期
- 部編人教版二年級(jí)語(yǔ)文(下冊(cè))期末試卷及答案(匯編)
- 特種工安全崗前培訓(xùn)課件
- 新疆維吾爾自治區(qū)普通高中2026屆高二上數(shù)學(xué)期末監(jiān)測(cè)試題含解析
- 2026屆福建省三明市第一中學(xué)高三上學(xué)期12月月考?xì)v史試題(含答案)
- 2026年遼寧金融職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)附答案解析
- (正式版)DB51∕T 3342-2025 《爐灶用合成液體燃料經(jīng)營(yíng)管理規(guī)范》
- 2026北京海淀初三上學(xué)期期末語(yǔ)文試卷和答案
- 2024-2025學(xué)年北京市東城區(qū)五年級(jí)(上)期末語(yǔ)文試題(含答案)
- 人工智能在醫(yī)療領(lǐng)域的應(yīng)用
- 2025學(xué)年度人教PEP五年級(jí)英語(yǔ)上冊(cè)期末模擬考試試卷(含答案含聽(tīng)力原文)
- 【10篇】新部編五年級(jí)上冊(cè)語(yǔ)文課內(nèi)外閱讀理解專(zhuān)項(xiàng)練習(xí)題及答案
- 南京市雨花臺(tái)區(qū)醫(yī)療保險(xiǎn)管理中心等單位2025年公開(kāi)招聘編外工作人員備考題庫(kù)有完整答案詳解
評(píng)論
0/150
提交評(píng)論