1. 程式人生 > >Qt 中實現在控制元件中點選滑鼠,就在滑鼠點選處載入圖片的方法

Qt 中實現在控制元件中點選滑鼠,就在滑鼠點選處載入圖片的方法

首先應該知道,QLabel類是沒有點選事件的。我們需要點選滑鼠,那麼必須重寫一個QLabel類去繼承原來的QLabel。比如說我定義PutPicLabel來繼承QLabel。

在標頭檔案中應該這麼寫:

#ifndef PUTPICLABEL_H
#define PUTPICLABEL_H

#include <QLabel>
#include <QWidget>
#include <QPoint>
#include <QPixmap>
#include <QPaintEvent>
#include <vector>

using namespace std;

typedef struct PicPointInfo{//存圖片的資訊
    QPoint picPoint;//圖片的起始位置
    int picState;//需要載入哪種圖片
}PicInfo;

class PutPicLabel:public QLabel{
    Q_OBJECT
public:
    ~PutPicLabel();
    PutPicLabel(QWidget* parent);
public:
    void mousePressEvent(QMouseEvent* event);
    virtual void paintEvent(QPaintEvent* event) override;
    QPixmap soldierImage;
    QPixmap tankImage;
    vector<PicInfo*> Pics;
};

#endif // PUTPICLABEL_H

一共重寫了兩個函式,一個是mousePressEvent,也就是滑鼠點選事件;另一個就是paintEvent,畫圖函式,用這個函式來進行載入圖片。具體如下:

#include "putpiclabel.h"
#include "mainwindow.h"

#include <QMessageBox>
#include <QString>
#include <QMouseEvent>
#include <QDebug>
#include <QRect>
#include <QImage>
#include <QPainter>


PutPicLabel::~PutPicLabel(){

}

PutPicLabel::PutPicLabel(QWidget* parent):QLabel(parent){
    this->setMouseTracking(true);
    mouseState=0;//置初值為0,表明現在沒有圖片被點選
    soldierImage.load(":/image1/soldier.jpg");
    tankImage.load(":/image1/tank.jpg");
}

void PutPicLabel::mousePressEvent(QMouseEvent *event){

    if(event->button()==Qt::LeftButton){//如果滑鼠左鍵被點選
        PicInfo *pic=new PicInfo;
        switch (mouseState) {
        case 1://士兵被點選
            pic->picPoint=event->pos();
            pic->picState=1;
            this->Pics.push_back(pic);
            update();
            break;
        case 2://坦克被點選
            pic->picPoint=event->pos();
            pic->picState=2;
            this->Pics.push_back(pic);
            update();
            break;
        default:
            break;
        }
    }
}
void PutPicLabel::paintEvent(QPaintEvent *event){
    QPainter painter(this);
    for(int i=0;i<Pics.size();i++){
        PicInfo *pPic=Pics[i];
        switch (pPic->picState) {
        case 1://是個士兵的圖片
            painter.drawPixmap(pPic->picPoint.x(),pPic->picPoint.y(),60,60,soldierImage);
            break;
        case 2://是個坦克的圖片
            painter.drawPixmap(pPic->picPoint.x(),pPic->picPoint.y(),60,60,tankImage);
            break;
        default:
            break;
        }
    }
}


主要思想是這樣的。首先有一個vector容器,這樣子可以把大量的圖片都存進來統一進行顯示。其次對於mousePressEvent,每次點選左鍵,把這個滑鼠點選的位置,以及這個圖片是士兵還是坦克這兩個資訊放在結構體裡面,壓進容器vector,這樣畫圖的時候,既能顯示多張不同圖片,也能顯示出位置來。對於paintEvent,同樣從這個容器的頂開始畫,每張圖片都畫出來,需要判斷是什麼圖片,以及在哪裡畫。

這裡update函式需要知道,每次呼叫update函式,實際上都是呼叫paintEvent函式。

以及還需要知道怎麼把圖片新增進資源中,實現load函式的效果。

最終的效果如下,最右邊豎著的是兩張圖,每次點選這兩張圖的一張,在整個介面上面隨意點選,都能加載出來你剛才點選的那一張。



相關推薦

swiper控制元件loop迴圈後不能的上一個組的bug

起因: 專案中使用到Swiper,迴圈滾動, 使用 “迴圈 loop”引數後,  發現上一個元素無法點選點選。 使用中發現他會在首部和尾部。自動建立兩個元素,並且導致該元素的onClick事件會失效,如下圖紅色框部分: 解決方式: 使用 class 獲取點選事件,

如何設定Qt控制元件透明度

引入QGraphicsOpacityEffect類,設定QGraphicsOpacityEffect物件的透明度,然後將此透明度應用到控制元件上。 需要包含的標頭檔案: #include <QGraphicsOpacityEffect> 程式碼: ... m_w

Qt窗體控制元件按照比例縮放自適應視窗大小進行佈局

    最近在做本科畢設,用到了Qt,無奈本人實在是太過於小白了,很多東西都進行了很久的探索,比如今天說到的窗體控制元件佈局...一把辛酸淚     首先就是建立一個GUI檔案,然後進行UI設計,這裡就只需要從左邊進行拖拽,這個很easy啦...     然後對其進行佈局

解決ListViewItem的子控制元件(比如Button)與Item事件衝突

經常會碰到在ListView中點選其中一個Item,會一併觸發其子控制元件的點選事件,例如Item中的Button、ImageButton等,導致了點選Item中Button以外區域也會觸發Button點選事件。在網上找了相關方法,這裡記錄下,親測可行.. 1、在Item

JQuery控制div外隱藏div內不會隱藏

比如有個div其id為body,實現在div外點選隱藏,div內點選不隱藏,採用jQuery實現如下: $("#body").click(function(e) { $(this).show()

jquery實現checkbox全功能第二次【全】按鈕頁面無法勾

去面試,老多人問會不會jQuery啊,會不會ExtJS啊,以前都零星使用過,是使用別人封裝好的版本,沒單獨研究過這些前端技術,閒暇之餘,先研究研究jQuery。 找了本書,做了個jQuery實現全選功能的例子,覺得程式碼邏輯上都沒有問題,第二次點選【全選】按鈕頁面就是無法勾

利用Runtime來攔截UIButton的事件防止重複

對於公司原來的一些程式碼,想對UIButton的點選事件做一部分修改,但是如果使用繼承出來的UIBtton來解決的話, 又要改大量的程式碼,這時候,使用runtime攔截替換髮送點選事件的方法可以迅速解決這個問題,超級給力! 不廢話,直接上程式碼 #im

Qt 實現控制元件中點滑鼠滑鼠載入圖片方法

首先應該知道,QLabel類是沒有點選事件的。我們需要點選滑鼠,那麼必須重寫一個QLabel類去繼承原來的QLabel。比如說我定義PutPicLabel來繼承QLabel。 在標頭檔案中應該這麼寫: #ifndef PUTPICLABEL_H #define PUTPI

WPF重疊控制元件滑鼠穿透

Problem:有控制元件A和控制元件B,位置完全重疊,B覆蓋在A上方。換句話說,B只是A的修飾(實現中經常有可能會碰到這樣的情況,比如B可能是一個png圖片,你又不想重寫A的模板),我們需要在滑鼠操作時透過B直接點選到A。 Solution:你可能會想讓B的滑鼠事件不執行(e.handle=f

wpfListView控制元件列頭排序功能實現(超簡潔實用)

 .xaml檔案中的主要程式碼 <ListView Name="lvMeasureData" GridViewColumnHeader.Click="Sort_Click" SelectionChanged="lvMeasureData_SelectionChanged"

在Activity引用控制元件以及控制元件事件

今天我們要講的是在Activity中使用控制元件,我們在AndroidStudio中建立好了專案,會有一個Mainactivity,對了這裡推薦大家在使用AndroidStudio寫程式碼的時候,選擇project如下圖: 選擇這種結構呢,大家可以很清楚的看到專案目錄結構 良好的

Qt QTreeWidget 加入控制元件——以QPushButton為例

QPushButton *topLevelButton = new QPushButton("Top Level Button"); ui->treeWidget->addTopLevelItem(topLevelItem); ui->tre

用winform實現的類似於WPFPopUp控制元件的一段程式碼

用winform實現的類似於WPF中PopUp控制元件的一段程式碼 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using Syste

Qt學習(21)——Qt5控制元件

QLabel QLabel用於顯示文字和影象,但是沒有使用者互動可用。 //label.h #pragma once #include <QWidget> #include <QLabel> class Label : public

Qt實現滑鼠一段時間不用自動隱藏

Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->setMouseTracking(true);

在.Net的WinForm開發如何實現控制元件隨窗體大小的改變而自動適應其改變

在設計可供使用者調整大小的窗體時,如何實現該窗體上的控制元件也應能正確地隨窗體的改變而自動調整大小並且能重新定位?此時就要藉助控制元件的.Anchor屬性。Anchor屬性定義控制元件的定位點位置。當控制元件錨定到某個窗體時,如果該窗體的大小被調整,那麼該控制元件維持它與定位

Android 按鈕實現控制元件顯示隱藏

我寫了一個自定義的listview,listview 每一列點選切換圖示 同時顯示 隱藏的佈局,再次點選則隱藏該佈局。以下是判斷的程式碼: holder.isShowlin.setOnClickListener(new View.OnClickListener() { @

UIView 控制元件事件穿透 Passthrough 的實現

2012-02-19 — Unmi 我們在有多個 UIView 層疊時,比如一個按鈕被一個 UIView 遮蓋時,想要在點選最上層的 UIView 時能觸發按鈕的相應事件,我們該如何實現呢,初步可以想到幾種辦法: 1. 把按鈕上層的所有 UIView 的 userInt

C# DataGridView控制元件中點中行顏色更改

突出顯示選中的行資料 設定DataGridView的SelectionMode屬性為FullRowSelect   ,使控制元件能夠整行選擇 設定 ReadOnlY 屬性為TRUE  使其只讀 設定DefaultCellStyle.SelectionBackColor

Qt:讓QML控制元件自動縮放

為了讓QML開發的程式適應更多的裝置,我們可能需要去縮放Item,但是手動縮放開發太耗時還容易出錯,所以我封裝了一下 效果是根據開發時的x、y、width、height自動縮放的擴充套件 效果(3個效果是引數不同組合的結果): 正常情況下 拉寬 拉長 拉大 A