头文件:
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "mywidget.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
void OnSelectedBtn(QRect a);
};
#endif // MAINWINDOW_H
mywidget.h(继承于QWidget)
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QPixmap>
#include <QPainter>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QPoint>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
signals:
void selected(QRect a);//信号
public slots:
private:
void paintEvent(QPaintEvent *event); //绘图函数
void mouseMoveEvent(QMouseEvent *event); //鼠标移动
void mousePressEvent(QMouseEvent *event); //鼠标点击
void mouseReleaseEvent(QMouseEvent *event); //鼠标抬起
private:
QPixmap my_picture;
bool m_pressedFlag;//获取鼠标是否按下
QPoint currPos;//鼠标当前位置
QPoint startPos,endPos;//起始、结束、坐标
};
#endif // MYWIDGET_H
源文件:
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
// MyWidget p;
// p.resize(400,300);
// p.move(200,200);
// p.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->selectedwidget,SIGNAL(selected(QRect)),
this,SLOT(OnSelectedBtn(QRect)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::OnSelectedBtn(QRect a)
{
qDebug() << "关联......";
}
mywidget.cpp
#include "mywidget.h"
#include <QtGui>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent)
{
m_pressedFlag = false;
startPos = endPos = QPoint(0,0);
my_picture.load("D:/QT_Library/QJie_Tu/1.jpg");//图片存放位置
}
void MyWidget::paintEvent(QPaintEvent *event)//绘图函数
{
QPainter painter(this);
int width = this->width();
int height = this->height();
painter.drawPixmap(0,0,width,height,my_picture);//添加本地图片作为背景
if(m_pressedFlag)//如果鼠标按下
{
//构建十字交叉线
painter.setPen(QColor(0xFF,0,0));//设置线条颜色
painter.drawLine(QPoint(0,currPos.y()),QPoint(width,currPos.y()));//X轴
painter.drawLine(QPoint(currPos.x(),0),QPoint(currPos.x(),height));//Y轴
}
QRect select(startPos,endPos);//构建截图选择框
//普通画法
// painter.setBrush(QColor(0x88,0x88,0x88));
// painter.drawRect(select);
//透明度画法
QRect full(0,0,width,height);
painter.setBrush(QColor(0,0,0,100));
painter.setClipRegion(QRegion(full)-QRegion(select));
painter.drawRect(full);
}
void MyWidget::mouseMoveEvent(QMouseEvent *event)//鼠标移动
{
if(m_pressedFlag)
{
currPos = event->pos();
endPos = event->pos();
update();
}
}
void MyWidget::mousePressEvent(QMouseEvent *event)//鼠标按下
{
m_pressedFlag = true;
startPos = endPos = event->pos();//截图框开始坐标
}
void MyWidget::mouseReleaseEvent(QMouseEvent *event)//鼠标抬起
{
m_pressedFlag = false;
update();
QRect a(startPos,endPos);
emit selected(a);//发射信号
}
设计界面:(选择Widget控件,提升为自定义控件)
效果图: