激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - Qt實現圖片移動實例(圖文教程)

Qt實現圖片移動實例(圖文教程)

2020-11-16 15:41C語言教程網 C/C++

這學期實訓的時候用MFC做過一個飛機大戰,很無聊的東西,一直想用Qt做一個;首先需要解決的問題是圖片的移動,怎么說飛機啊子彈啊都是動著的,圖片當然要跑起來,感興趣的你可不要走開啊

這學期實訓的時候用MFC做過一個飛機大戰,很無聊的東西,一直想用Qt做一個,但是在學校的時候比較頹,回來看了一下。

首先需要解決的問題是圖片的移動,怎么說飛機啊子彈啊都是動著的,圖片當然要跑起來。

閑話休絮,首先用QtCreator新建一個QtGui程序,命名為PaintWidget,隨便起的名字,實驗么這不是。

Qt實現圖片移動實例(圖文教程)

會生成這三個文件,其中呢ui不用管,實驗的圖片移動需要用的是Event,不是信號槽,所以ui就不管了,放了那就是。

Qt實現圖片移動實例(圖文教程)

第一步要把圖片畫出來,參照《Qt學習之路的這段代碼》,不難把圖畫出來,就是重寫paintEvent方法,用QPainter對象來畫圖。

復制代碼 代碼如下:

void  PaintedWidget::paintEvent(QPaintEvent *event) 
{ 
        QPainter  painter(this); 
        QPixmap pixmap("Cat.png"); 
         QBitmap bitmap("Cat.png"); 
        painter.drawPixmap(10, 10, 128,  128, pixmap); 
        painter.drawPixmap(140, 10, 128, 128, bitmap);  
        QPixmap pixmap2("Cat2.png"); 
        QBitmap  bitmap2("Cat2.png"); 
        painter.drawPixmap(10, 140, 128, 128,  pixmap2); 
        painter.drawPixmap(140, 140, 128, 128, bitmap2); 
}


這是他的結果

Qt實現圖片移動實例(圖文教程)

問題是如何使用圖片資源:

在《C++ GUI Qt4 編程 (第二版)》這本書中有例子,直接搜這本書的源代碼,在src\chap04有發現,原來Qt引用資源是用的資源文件這個東西,是一個xml,QtCreator中很方便管理。

首先是在項目中添加文件,選擇Qt的資源文件:

Qt實現圖片移動實例(圖文教程)  Qt實現圖片移動實例(圖文教程)

因為以后可能有很多圖片,所以我在工程目錄下新建了img這么個文件夾來存放圖片。

生成的資源文件里面有個添加前綴,這個是qt中引用資源需要用的,后面再說,添加文件不用啰嗦了。

Qt實現圖片移動實例(圖文教程)

為了方便說明,先把源代碼發上來

mainwindow.h 

復制代碼 代碼如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void paintEvent (QPaintEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);

private:
Ui::MainWindow *ui;
QPixmap *catImg;
QRect *catImgRect;

protected:
int shrinkMultiple;
int speed;
};

#endif // MAINWINDOW_H


其中 QPixmap*catImg;就是圖片對象的指針,因為我的圖片是一直貓,所用就起了這么個名字。

QRect*catImgRect;是這個圖片的矩形信息,以為圖片移動的時候圖片的x,y坐標的值會改變,矩形信息會改變,而繪圖函數里面有個根據矩形信息和圖片指針繪制函數的這么一個函數

painter.drawPixmap(*catImgRect,*catImg);

為了方便起見,用catImgRect來存儲這些信息。

而int shrinkMultiple;這個是圖片的縮放倍數,我貓的圖片有點兒大,把他縮小了一下,當然可以沒有

這個int speed;則是圖片移動的像素數

ok,下面是mainwindow.cpp

復制代碼 代碼如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
shrinkMultiple(2),speed(10)
{
ui->setupUi(this);
catImg = new QPixmap(":/img/cat.jpg");
int width = catImg->width () / shrinkMultiple;
int height = catImg->height () / shrinkMultiple;
catImgRect = new QRect(10,10,width,height);
QRect rect = this->geometry ();
rect.setWidth (width*4);
rect.setHeight (height*4);
rect.setX (20);
rect.setY (50);
this->setGeometry (rect);
}
void MainWindow::paintEvent (QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(*catImgRect,*catImg);
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
}
void MainWindow::keyPressEvent(QKeyEvent *event)
{
int width = catImgRect->width ();
int height = catImgRect->height ();
switch(event->key ())
{
case Qt::Key_Left:
{

catImgRect->setX (catImgRect->x ()-speed);

break;
}
case Qt::Key_Right:
{
catImgRect->setX (catImgRect->x ()+speed);
break;
}
case Qt::Key_Down:
{
catImgRect->setY (catImgRect->y ()+speed);
break;
}
case Qt::Key_Up:
{
catImgRect->setY (catImgRect->y ()-speed);
break;
}
}
catImgRect->setHeight(height);
catImgRect->setWidth (width);
this->repaint ();

}
MainWindow::~MainWindow()
{
delete catImg;
delete catImgRect;
delete ui;
}


首先看構造函數,其中

復制代碼 代碼如下:

catImg=new QPixmap(":/img/cat.jpg");


這里是引用資源文件,:/img/cat.jpg,冒號后面的第一個斜杠就是剛剛加的前綴。

下面幾行是縮小貓的圖片和初始化貓矩形信息,最后一行是把程序窗口大小設這為貓圖片大小的4倍。

畫圖函數就是paintEvent這個函數,沒什么特別說的,這個函數只要是窗口一被重繪就會調用的。

關鍵的移動就是重寫

復制代碼 代碼如下:

voidMainWindow::keyPressEvent(QKeyEvent*event)


這個函數,沒什么特別說明的,出了最后一行

復制代碼 代碼如下:

this->repaint();


只要是鍵盤被按下,則重繪窗口,如果沒有這個函數的話,貓矩形確實變了,但是圖片的位置沒有變化,除非等到重繪的時候才會調用paintEvent函數,什么時候重繪的,當這部分窗口被遮蔽,最大化最小化,窗口移動的時候(可能還有),repaint函數的作用是立即重繪,所以圖片就能馬上移動了。

圖片移動是沒有問題了,關鍵是不是很流暢,當時用MFC的時候是用定時器來解決的這個問題,Qt中也有定時器,改天再研究,不過可能會出現問題,就是窗口閃爍的問題,這個時候應該會用到雙緩沖畫圖的技術。

貼個最終的圖片

Qt實現圖片移動實例(圖文教程)

Qt實現圖片移動實例(圖文教程)

Qt實現圖片移動實例(圖文教程)

延伸 · 閱讀

精彩推薦
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 黄色av片三级三级三级免费看 | 本色视频aaaaaa一级网站 | 久久久无码精品亚洲日韩按摩 | 伦一区二区三区中文字幕v亚洲 | 成人黄色一级电影 | 国产午夜精品理论片a级探花 | 夜夜夜影院 | 国产一区二区欧美精品 | 国产成人精品自拍视频 | 国产毛片网 | 久久精品女人天堂av | 亚洲国产色婷婷 | 色悠悠久久久久 | 911色_911色sss主站色播 | 91网视频 | 成人一级毛片 | 午夜啪视频 | 久久99亚洲精品久久99果 | 一区二区三区日韩 | 国产精品久久久久永久免费 | 午夜视频观看 | 亚洲男人的天堂在线视频 | 亚洲成人自拍电影 | 91久久另类重口变态 | 日本成人二区 | 日韩字幕在线观看 | 成人爱爱电影 | 男男羞羞视频网站国产 | 免费在线观看中文字幕 | 黄片毛片一级 | 精品一区二区三区毛片 | 中午日产幕无线码1区 | 国产欧美日韩在线不卡第一页 | 国产黄色一区二区 | 国内精品久久久久久久影视红豆 | 美国一级毛片片aa久久综合 | 日日摸夜夜添夜夜添牛牛 | 久久出精品 | chinese-xvideos| 亚洲第一成人在线 | 久久精品无码一区二区日韩av |