學習目標: 鼠標事件和鍵盤事件應用
前置環境
運行環境:qt?creator 4.12
學習內容和效果演示:
1.鼠標事件
根據鼠標的坐標位置,做出對應的事件。
2.鍵盤事件
根據鍵盤的輸入做出對應操作
詳細主要代碼
1.鼠標事件
#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{status = new QLabel("鼠標在當前窗口坐標為:");status->setFixedWidth(200);mouser = new QLabel("");mouser->setFixedWidth(200);statusBar()->addPermanentWidget(status);statusBar()->addPermanentWidget(mouser);this->setMouseTracking(true);resize(800,600);QImage *image=new QImage();if(!image->load("C:/Users/jbj/Pictures/test/IMG_5037.JPG")){QMessageBox::information(this,"失敗","加載圖片失敗,請重新檢查?");delete image;return;}QLabel* imglabe = new QLabel(this);imglabe->setFixedSize(200,300);imglabe->setPixmap(QPixmap::fromImage(*image));
}MainWindow::~MainWindow()
{
}//鼠標移動時被調用
void MainWindow::mouseMoveEvent(QMouseEvent *e){mouser->setText("("+QString::number(e->x())+","+QString::number(e->y())+")");
}
//鼠標按下時被調用
void MainWindow::mousePressEvent(QMouseEvent *e){QString qstr="("+QString::number(e->x())+","+QString::number(e->y())+")";if(e->button()==Qt::LeftButton){statusBar()->showMessage("用戶已按下鼠標[左鍵]坐標"+qstr);}else if(e->button()==Qt::RightButton){statusBar()->showMessage("用戶已按下鼠標[右鍵]坐標"+qstr);}else if(e->button()==Qt::MidButton){statusBar()->showMessage("用戶已按下鼠標[中鍵]坐標"+qstr);}
}
//鼠標釋放時被調用
void MainWindow::mouseReleaseEvent(QMouseEvent *e){QString qstr="("+QString::number(e->x())+","+QString::number(e->y())+")";statusBar()->showMessage("用戶已釋放鼠標坐標"+qstr,20);
}
?2.鍵盤事件
這里用到了繪畫的知識點
畫板 Qpalette? ? 畫家 Qpainter? 鋼筆QPen
理解:畫師在畫板上做畫,會用到鋼筆,當要展現時,QPainter 負責將畫板呈現。
#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{setWindowTitle("鍵盤測試");setAutoFillBackground(true);//調色板QPalette pale =this->palette();pale.setColor(QPalette::Window,Qt::white);setPalette(pale);setMinimumSize(800,600);setMaximumSize(800,600);width=size().width();height=size().height();pix=new QPixmap(width,height);//畫板pix->fill(Qt::white);//實際物體main=new QPixmap(28,28);main->fill(Qt::red);sx=30;sy=30;step=30;Drawpinit();resize(800,600);
}
void Widget::Drawpinit(){pix->fill(Qt::white); // 清空QPainter* painter =new QPainter;//畫家QPen pen(Qt::DashDotLine);for (int i=step; i<width;i+=step) { //豎線painter->begin(pix); //選擇畫板painter->setPen(pen);painter->drawLine(QPoint(i,0),QPoint(i,height));painter->end();}for(int j=step;j<height;j=j+step) // 橫線{painter->begin(pix); //選擇畫板painter->setPen(pen);painter->drawLine(QPoint(0,j),QPoint(width,j));painter->end();}painter->begin(pix);painter->drawPixmap(QPoint(sx,sy),*main);painter->end();
}void Widget::paintEvent(QPaintEvent *){QPainter painter;painter.begin(this);//將之前在 Drawpinit() 函數中繪制的 QPixmap 對象繪制到 Widget 的左上角(坐標 (0, 0))。painter.drawPixmap(QPoint(0,0),*pix);painter.end();}
void Widget::keyPressEvent(QKeyEvent *evt){sx=sx-sx%step;sy=sy-sy%step;//左右移動if(evt->key()==Qt::Key_Left){sx=(sx-step<0)?sx:sx-step;}if(evt->key()==Qt::Key_Right){sx=(sx+step+main->width() > width)?sx:sx+step;}if(evt->key()==Qt::Key_Up){sy=(sy-step<0)?sy:sy-step;}if(evt->key()==Qt::Key_Down){sy=(sy+step+main->height() >height)?sy:sy+step;}Drawpinit(); //重新設置參數update(); //觸發繪畫
}
Widget::~Widget()
{}
總結:
鍵盤事件:
????????void keyPressEvent(QKeyEvent *evt) //按下時被調用
鼠標事件:
? ? ? ? ? ?//鼠標移動時被調用
? ????????? void mouseMoveEvent(QMouseEvent *e);
? ? ????????//鼠標按下時被調用
? ? ????????void mousePressEvent(QMouseEvent *e);
? ? ????????//鼠標釋放時被調用
? ????????? void mouseReleaseEvent(QMouseEvent *e);
詳細開發則需查閱官方開發文檔。
最后附上源代碼鏈接
對您有幫助的話,幫忙點個star
26-mouserEvent · jbjnb/Qt demo - 碼云 - 開源中國 (gitee.com)
27-QkeyEvent · jbjnb/Qt demo - 碼云 - 開源中國 (gitee.com)