1. 程式人生 > >QT滑鼠點選響應事件

QT滑鼠點選響應事件

假如我們想在視窗指定區域響應滑鼠點選事件,怎麼辦呢?

比如我們有一個widget視窗,該窗口裡有一個PixmapLabel圖片,
我們假設想在圖片的左上角響應滑鼠的點選事件,那麼我們可以這樣做!

1. 建立一個新類
//mainForm.h
#ifndef MAINFORM_H
#define MAINFORM_H
#include <qevent.h>
#include <qvariant.h>
#include <qwidget.h>
#include <qmessagebox.h>

class QVBoxLayout;
class QHBoxLayout;
class QGridLayout;
class QLabel;

class mainForm : public QWidget
{
    Q_OBJECT

public:
    mainForm( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
    ~mainForm();

    QLabel* myPixmapLabel;        
    
signals:
    void clicked();
   
public slots:
    virtual void mousePressEventSlot();

protected:
    void mousePressEvent(QMouseEvent *);
   
protected slots:
    virtual void languageChange();
};

#endif // MAINFORM_H

2. 實現檔案

//mainForm.cpp
#include "mainForm.h"

#include <qvariant.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qtooltip.h>
#include <qwhatsthis.h>
#include <qimage.h>
#include <qpixmap.h>

/*
 *  Constructs a mainForm as a child of 'parent', with the
 *  name 'name' and widget flags set to 'f'.
 */
mainForm::mainForm( QWidget* parent, const char* name, WFlags fl )
    : QWidget( parent, name, fl )
{
    if ( !name )
    setName( "mainForm" );
   
    //setCaption("Qt Mouse Click Event Example");

    myPixmapLabel = new QLabel( this, "myPixmapLabel" );
    myPixmapLabel->setGeometry( QRect( 120, 60, 300, 270 ) );
    //放置一個圖片,該圖片應該在同一資料夾裡,否則要指定路徑
    myPixmapLabel->setPixmap( QPixmap::fromMimeSource( "about-to-install.png" ) );   
    myPixmapLabel->setScaledContents( TRUE );
    languageChange();
    resize( QSize(600, 480).expandedTo(minimumSizeHint()) );
    connect( this, SIGNAL( clicked() ), this, SLOT( mousePressEventSlot() ) );   //訊號連線
}

/*
 *  Destroys the object and frees any allocated resources
 */
mainForm::~mainForm()
{
    // no need to delete child widgets, Qt does it all for us
}
void mainForm::mousePressEvent(QMouseEvent *e)

    int x = e->x();
    int y = e->y();
    //假如在QRect( 120, 60, 200, 200 ) );這個區域裡,就發出訊號
    if (x>120 && x<200 && y>60 && y<200)
        emit clicked();
}
void mainForm::mousePressEventSlot()
{
    //該訊號響應的曹
    //給出一個提示資訊
    QMessageBox::about( this, "Qt Mouse Click Event Example",
                        "You haved clicked the prearranged position /nand the widget will be closed."
                        );
    close();  //關閉程式
}
/*
 *  Sets the strings of the subwidgets using the current
 *  language.
 */
void mainForm::languageChange()
{
    setCaption( tr( "Qt Mouse Click Event Example" ) );
}


3. main 函式
//main.cpp
#include <qapplication.h>
#include "mainForm.h"

int main( int argc, char ** argv )
{
    QApplication a( argc, argv );
    mainForm w;
    w.show();
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
    return a.exec();
}


將三個上述檔案放在同一資料夾裡,然後新建 pro 檔案:

TEMPLATE = app
INCLUDEPATH += .
# Input
HEADERS += mainForm.h
SOURCES += main.cpp mainForm.cpp

然後:
qmake
make
直接執行,看看效果如何?

相關推薦

QT滑鼠響應事件

假如我們想在視窗指定區域響應滑鼠點選事件,怎麼辦呢?比如我們有一個widget視窗,該窗口裡有一個PixmapLabel圖片,我們假設想在圖片的左上角響應滑鼠的點選事件,那麼我們可以這樣做!1. 建立一個新類//mainForm.h#ifndef MAINFORM_H#def

openlayers 滑鼠互動事件

目前,openlayers中利用ol.interaction.Select介面進行事件互動操作。在此介面中,有幾個重要的引數說明如下: condition:表示滑鼠事件型別,例如ol.events.condition.click表示單擊事件(其他事件可參考api) style:可為style

js 操作當前滑鼠事件 解決 div ul 下拉框事件

$(document).click(function(){ if ($(event.srcElement).is("#elem,#elem *")) { // alert('內部區域'); } else { alert('你的點選不在目標區域'); }

C# winform 無邊框窗體滑鼠移動事件

這裡所謂的無邊框窗體是指去除系統自帶的標題欄和最大最小化等那周圍一圈的窗體 即把窗體的FormBorderStyle設定為none後的窗體(效果如下) 這是有邊框的: 去除邊框的: 右邊框窗體想要移動位置,用滑鼠點選標題欄移動即可,那麼沒邊框的該如何移動這個問題,

UGUI響應事件

只需要在對應的UGUI物件上掛個指令碼,實現IPointerClickHandler(引用 using UnityEngine.EventSystems)介面,在類裡面實現 public  void OnPointerClick(PointerEventData event

Android小記:ListView中的按鈕響應事件

在Adapter中定義一個回撥介面,在Activity中實現該介面,從而實現對點選事件的響應。 有兩種方式都能比較好的實現:使用介面回撥和使用抽象類回撥 1.使用介面回撥: Adapter類: package com.ivan.adapter;

windows訊息機制與ASP.net winform控制元件訊息傳遞之滑鼠click事件

window系統是一個訊息驅動的系統, windows作業系統本身有自己的訊息佇列,訊息迴圈,它捕捉鍵盤,滑鼠的動作生成訊息,並將這個訊息傳給應用程式的訊息佇列。 當用戶用滑鼠click桌面時,其實使用者是不能直接接觸到某個控制元件的。表面上看,的確是使用者用

Qt-Qlabel 自定義滑鼠事件以及文字樣式效果設計

最近專案中需要實現一個訊息推送的功能,模仿QQ訊息彈窗的方式實現,介面開發的工具為Qt。對桌面應用開發這塊不太熟悉,通過摸索嘗試也算是把這個功能實現了,其中也碰到了一些比較麻煩的問題,這些問題我看也具有一定的普遍性,就把我摸索出來的解決方法和大家分享下(可能有更好的方法我沒

手持裝置響應速度,滑鼠事件與touch事件的那些事

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="h

QT中模擬滑鼠事件

傳入座標,模擬滑鼠點選QWebView中網頁上的某一點 qDebug()<<"mouse clicked"; QPoint pos(403,34); QMouseEvent event0(QEvent::Mous

ubuntu | 不重啟解決桌面假死無響應滑鼠無效等問題

ubuntu有7個tty,tty1-6是全屏命令列,tty7是圖形介面,正常情況系統預設優先啟動tty7圖形介面。 (這裡要特別強調一下使用筆記本的同學,請注意鍵盤上是否有"Fn"鍵。) 先說怎麼回到圖形介面: ctrl + alt + f7 (Fn鍵筆記本)

QTableWidget無法響應滑鼠(QMousePressEvent)的問題

1 前言 使用QTableWidget顯示內容時想要通過觸發itemSelectionChanged()訊號時執行某些操作,但是在表格只有一行時發現此訊號無法觸發,即使點選空白區域。  因此想要捕獲父視窗的QMousePressEvent() 來觸發自定義訊號,發現在表格內的

[PyQt] 自定義QSlider支援滑鼠和滾輪事件

from PyQt4.QtGui import * from PyQt4.QtCore import * class progressSlider(QSlider): def __init__(self, orientation, parent=None): su

主角人物移動(一)-滑鼠事件與通過射線獲取座標

Ray playerRay;//射線 RaycastHit playerHit;//射線碰撞資訊 Vector3 targetPos;//定義滑鼠點選位置 int mapTargetMask;//定義碰撞層級引數void Start () { //獲取地圖層級

C++實現WebBrowser控制元件中對滑鼠事件的監聽,並獲取所標籤的超連結

        主要步驟如下:         1、接收網頁事件(參考資料) 要響應網頁事件,需要實現IDispatch介面,並在其Invoke()方法中處理收到的訊息。對於MFC,因為CCmdTarget類已經實現了該介面,所以只需要繼承CCmdTarget並結合相關巨

使用JS或jQuery模擬滑鼠a標籤事件程式碼

<a id="alink" href="abc.aspx" style="visibility: hidden;">下一步</a> $("#alink").click(); // 觸發了a標籤的點選事件,但是沒有觸發頁面跳轉 document.g

Qt實現讀取影象並且視窗加滑動條,影象在滑鼠處繪製小影象

最近有點忙,在拿Qt編一個軟體,其中有一小部分對影象進行處理的工作,自己通過查資料,寫了一個小例子,這個小例子可以實現讀取影象,給影象視窗新增滑動條,並且在影象上點選滑鼠,可以在滑鼠點選處加入一個小的影象。 廢話不多說。直接上原始碼: main.cpp: #include

Android中同一個button按鈕每次響應不同的事件

開發中我們經常會遇到當點選一次按鈕後,按鈕上的text顯示改變為其他的,又或者當點選一次按鈕後按鈕變為紅色,當再次點選,又變回原來的顏色。 為了實現這種功能,我們可以為按鈕設定flag來標誌,每點選一次後就修改flag的值,然後通過判斷flag的值來實現不同的功能。 &l

JS滑鼠事件(監聽滑鼠/釋放,滑鼠懸停/離開等)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

仿qq空間贊 文字分段響應事件

實現效果 :思路主要是使用TextView和SpanableStringBuilder的setSpan方法實現的  參考文件http://androiddoc.qiniudn.com/reference/android/text/SpannableStringBuild