欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt鍵盤事件實現(xiàn)圖片在窗口上下左右移動

 更新時間:2022年08月18日 16:05:35   作者:喝水怪~  
這篇文章主要為大家詳細介紹了Qt鍵盤事件實現(xiàn)圖片在窗口上下左右移動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Qt鍵盤事件實現(xiàn)圖片在窗口上下左右移動,供大家參考,具體內容如下

標簽(空格分隔): 鍵盤事件

一、項目內容:

新建桌面應用程序testKeyEvent,類名KeyEvent,基類QWidget,通過重寫鍵盤事件到達操作的鍵盤的時候窗口中的圖片上下左右移動,類似QtCreator設計模式下通過按鍵擺放部件時的效果。

二、實現(xiàn)細節(jié)

  • keyevent.h內容:
#ifndef KEYEVENT_H
#define KEYEVENT_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class keyEvent; }
QT_END_NAMESPACE

class keyEvent : public QWidget
{
? ? Q_OBJECT

public:
? ? keyEvent(QWidget *parent = nullptr);
? ? ~keyEvent();
? ? void drawPix(); ? ? ? ? //自定義成員函數(shù)用來在pixmap上繪制網(wǎng)格線和圖片
protected:

? ? void keyPressEvent(QKeyEvent *event) override; ? ? ?//重寫鍵盤按下事件
? ? void paintEvent(QPaintEvent *event) override; ? ? ? //重寫繪圖事件

private:
? ? Ui::keyEvent *ui;
? ? QPixmap *m_pix;
? ? QImage m_image;
? ? int m_startX; ? //圖標頂點的位置
? ? int m_startY;
? ? int m_width; ? ?//界面的寬度和高度
? ? int m_height;
? ? int m_step; ? ? //圖片移動的步長

};
#endif // KEYEVENT_H
  • 構造函數(shù):(初始化窗口大小、pximap、加載圖片、要顯示圖片左上角的坐標)
keyEvent::keyEvent(QWidget *parent)
? ? : QWidget(parent)
? ? , ui(new Ui::keyEvent)
{
? ? ui->setupUi(this);
? ? setWindowTitle("鍵盤事件");
? ? setAutoFillBackground(true);
? ? setFixedSize(512,256);
? ? m_width=size().width();
? ? m_height=size().height();

? ? m_pix=new QPixmap(m_width,m_height);
? ? m_pix->fill(Qt::white);

? ? m_image.load("../car.png"); //當前工作目錄默認Debug目錄下,car.png在上一級目錄下
? ? m_startX=100;
? ? m_startY=100;
? ? m_step=20;
? ? drawPix();
}
  • drawPix():定義Painter對象,并設置畫筆(虛線),m_pix作為繪圖設備,在上面繪制網(wǎng)格虛線,還有圖片的位置信息
void keyEvent::drawPix()
{
? ? m_pix->fill(Qt::white);
? ? QPainter painter(this);
? ? QPen pen(Qt::DotLine); //虛線

? ? painter.begin(m_pix); ? //m_pix為繪圖設備
? ? painter.setPen(pen);

? ? //按照步長畫縱向的網(wǎng)格虛線
? ? for(int i=m_step;i<m_width;i+=m_step){
? ? ? ? painter.drawLine(QPoint(i,0),QPoint(i,m_height));

? ? }
? ? //按照步長畫橫向的網(wǎng)格虛線
? ? for(int j=m_step;j<m_height;j+=m_step){
? ? ? ? painter.drawLine(QPoint(0,j),QPoint(m_width,j));
? ? }
? ? painter.end();

? ? //畫圖片
? ? painter.begin(m_pix);
? ? painter.drawImage(QPoint(m_startX,m_startY),m_image);
? ? painter.end();
}
  • 重寫鍵盤事件

1、按下Ctrl+方向鍵一次圖片移動一個像素的距離
2、普通方向鍵一次移動步長(m_step:20像素)的距離,ui界面下默認一次移動10個像素

void keyEvent::keyPressEvent(QKeyEvent *event)
{
? ? //按下ctrl鍵移動一個像素
? ? if(event->modifiers()==Qt::ControlModifier){
? ? ? ? if(event->key()==Qt::Key_Left){
? ? ? ? ? ? m_startX=(m_startX-1)<0?m_startX:m_startX-1;
? ? ? ? }else if(event->key()==Qt::Key_Right){
? ? ? ? ? ? m_startX=(m_startX+1+m_image.width())>m_width?m_startX:m_startX+1;
? ? ? ? }else if(event->key()==Qt::Key_Up){
? ? ? ? ? ? m_startY=(m_startY-1)<0?m_startY:m_startY-1;
? ? ? ? }else if(event->key()==Qt::Key_Down){
? ? ? ? ? ? m_startY=(m_startY+1+m_image.height())>m_height?m_startY:m_startY+1;
? ? ? ? }
? ? }else{
? ? ? ? //調整圖片左上角的位置到網(wǎng)格頂點
? ? ? ? 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)<0?m_startX:m_startX-m_step;
? ? ? ? }else if(event->key()==Qt::Key_Right){
? ? ? ? ? ? m_startX=(m_startX+m_step+m_image.width())>m_width?m_startX:m_startX+m_step;
? ? ? ? }else if(event->key()==Qt::Key_Up){
? ? ? ? ? ? m_startY=(m_startY-m_step)<0?m_startY:m_startY-m_step;
? ? ? ? }else if(event->key()==Qt::Key_Down){
? ? ? ? ? ? m_startY=(m_startY+m_step+m_image.height())>m_height?m_startY:m_startY+m_step;
? ? ? ? }
? ? }
? ? drawPix(); ?//刷新圖片的位置
? ? update();//觸發(fā)窗口重繪 ,執(zhí)行paintEvent();

}
  • 重寫QWidget類繪制事件

繪制事件觸發(fā)的條件:(查閱Qt幫助文檔)

1、repaint() or update() was invoked,
2、the widget was obscured and has now been uncovered, or
3、many other reasons.

void keyEvent::paintEvent(QPaintEvent *event)
{
? ? //定義Qpainter對象,設置窗口為繪圖設備,在窗口繪制pixmap
? ? QPainter painter;
? ? painter.begin(this);//繪圖設備為窗口
? ? painter.drawPixmap(QPoint(0,0),*m_pix);
? ? painter.end();


}

三、效果

可在任意位置移動小車

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關文章

  • C語言進階之字符串查找?guī)旌瘮?shù)詳解

    C語言進階之字符串查找?guī)旌瘮?shù)詳解

    字符串是一種非常重要的數(shù)據(jù)類型,但是C語言不存在顯式的字符串類型,C語言中的字符串都以字符串常量的形式出現(xiàn)或存儲在字符數(shù)組中,下面這篇文章主要給大家介紹了關于C語言進階之字符串查找?guī)旌瘮?shù)的相關資料,需要的朋友可以參考下
    2023-01-01
  • C++11中的智能指針和垃圾回收使用

    C++11中的智能指針和垃圾回收使用

    本文主要介紹了C++11中的智能指針和垃圾回收使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • 從頭學習C語言之if語句的使用

    從頭學習C語言之if語句的使用

    這篇文章主要為大家詳細介紹了C語言之if語句的使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++11新特性之智能指針(shared_ptr/unique_ptr/weak_ptr)

    C++11新特性之智能指針(shared_ptr/unique_ptr/weak_ptr)

    這篇文章主要介紹了C++11新特性之智能指針,包括shared_ptr, unique_ptr和weak_ptr的基本使用,感興趣的小伙伴們可以參考一下
    2016-08-08
  • C++中的整型

    C++中的整型

    這篇文章我們來聊聊C++中的整型,整型即整數(shù),與小數(shù)對應。許多語言只能表示一種整型(如Python),而在C++當中根據(jù)整數(shù)的范圍提供了好幾種不同的整型,下面文章我們就來看看具體是哪幾種,需要的朋友也可以參考一下
    2021-11-11
  • 全面解析C++中的析構函數(shù)

    全面解析C++中的析構函數(shù)

    這篇文章主要介紹了C++中的析構函數(shù),為C++入門學習中的基礎知識,需要的朋友可以參考下
    2016-01-01
  • C語言非遞歸算法解決快速排序與歸并排序產生的棧溢出

    C語言非遞歸算法解決快速排序與歸并排序產生的棧溢出

    上期我們講完了排序算法下,不知道小伙伴們有沒有發(fā)現(xiàn)一個問題,快速排序和歸并排序我們都是用遞歸來實現(xiàn)的,可能有小伙伴會問,如果說數(shù)據(jù)量很多話,棧區(qū)空間會不會不夠用呢?這期我們就來解決使用遞歸實現(xiàn)的排序導致棧溢出如何解決
    2022-04-04
  • C語言超詳細講解函數(shù)棧幀的創(chuàng)建和銷毀

    C語言超詳細講解函數(shù)棧幀的創(chuàng)建和銷毀

    我們知道c語言中函數(shù)都是被調用的,main函數(shù)里面能調用其他函數(shù),其實main函數(shù)也是被別的函數(shù)調用的,下面通過本文給大家分享c語言函數(shù)棧幀的創(chuàng)建和銷毀過程,一起看看吧
    2022-05-05
  • C語言實現(xiàn)階乘的示例詳解

    C語言實現(xiàn)階乘的示例詳解

    在現(xiàn)實中,我們做數(shù)學題總會遇到階乘問題,這在計算機中也不例外。 那我們應該怎么實現(xiàn)呢?下面小編就為大家講解一下C語言中階乘的實現(xiàn)
    2022-07-07
  • C++中對象&類的深入理解

    C++中對象&類的深入理解

    這篇文章主要給大家介紹了關于C++中對象&類的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05

最新評論