QT 鼠标单击窗口,跳转出新的Dialog窗口里面绘制一个异形图

QT 在dialog里面绘制一个背景图

我这里是单击屏幕后 跳出新的dialog窗口 先看下效果图:
在这里插入图片描述

在窗口对应的位置点击后 出来对应点窗口 并且在四角出现箭头

被点击的窗口:mainWindow.cpp
跳转出的窗口:measResult.cpp

一、在mainWindow.h文件:

public:
    //构造函数
    explicit MainWindow(QWidget *parent = 0);
    //析构函数
    ~MainWindow();
    //设定虚函数
    virtual void mouseReleaseEvent(QMouseEvent *event); //鼠标事件

二、在对应的mainwindow.cpp文件:

extern MeasResult *msRst;
/*
 * 2.鼠标单击按钮 显示窗口
**/
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
   int wd,hi,x,y;
   if(event->button() == Qt::LeftButton){
       wd = this->geometry().width();   //获取当前界面宽度并赋值
       hi = this->geometry().height(); //获取当前页面高度并赋值
	   x = event->pos().x();           //鼠标所在X位置
       y = event->pos().y();            //鼠标所在Y位置
       NUM_HH =  (x/(wd/8))+(((y-160)/((hi-160)/8))*8);
        //qDebug() << NUM_HH ;
       //在按钮所在的窗口区域触发
       if(x<wd/2 && (y-160)<= (hi-160)/2){
           NUM_Win = 1;
       }else if(x>=wd/2 && (y-160) <= (hi-160)/2){
           NUM_Win = 2;
       }else if(x<wd/2 && (y-160) > (hi-160)/2){
           NUM_Win = 3;
       }else if(x>wd/2 && (y-160) > (hi-160)/2){
           NUM_Win = 4;
       }
        if(y>160){
            //弹出新的窗口
            QPoint pos =  QCursor::pos();

            if(msRst == NULL){
                msRst = new MeasResult();
            }else{
                msRst->close();
                msRst = new MeasResult();
            }
            if(NUM_Win == 1){
                msRst->move(pos.x(),pos.y());
            }else if(NUM_Win == 2){
                msRst->move(pos.x()-621,pos.y());
            }else if(NUM_Win == 3){
                msRst->move(pos.x(),pos.y()-121);
            }else if(NUM_Win == 4){
                msRst->move(pos.x()-621,pos.y()-121);
            }

            msRst->show();
        }
   }
}

以上的全局变量:

	int NUM_HH;     //窗口序号      0~63
    int NUM_Win;    //所在窗口的区域   1:左上 2:右上 3:左下 4:右下 
当点击片屏幕后 会先触发单击事件,然后走到msRst位置 转入measresult.cpp

三、在measresult.h头文件:


#include <QDialog>
#include <QTableView>
#include <QStandardItemModel>
#include <QPaintEvent>
#include <QPixmap>
#include "mainwindow.h"
namespace Ui {
class MeasResult;
}

class MeasResult : public QDialog
{
    Q_OBJECT
public:
    explicit MeasResult(QWidget *parent = 0);
    ~MeasResult();
    //QPaintEvent类包含绘制事件的事件参数
    void paintEvent(QPaintEvent *event) ;

以上会添加一个QpaintEvent 事件 主要是用来绘制图片的

4、measresult.cpp文件:

#include "measresult.h"
#include "ui_measresult.h"

#include <QStandardItem>
#include <QHeaderView>
#include <QStandardItemModel>
#include <QPixmap>
#include <QBitmap>
#include <QPalette>

extern MainWindow *mainWin;

MeasResult *msRst;	//声明指针
MeasResult::MeasResult(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MeasResult)
{
    ui->setupUi(this);
    this->setWindowFlags (Qt::FramelessWindowHint); //设置窗口无边框
    this->setAttribute(Qt::WA_TranslucentBackground);
    this->setWindowOpacity(1);//设置透明度,默认是1为全不透明,0为全透明
    //提供了用于存储自定义数据的通用模型
    QStandardItemModel *model = new QStandardItemModel(0,6);
    //插入数据
    model->insertRows(0,1); //插入第一行
......
    model->insertRows(1,1); //插入第二行
......
    ui->tableView->setModel(model); //使用
}

MeasResult::~MeasResult()
{
    delete ui;
}

void MeasResult::paintEvent(QPaintEvent *event)
{
    //绘制背景图片
    QPainter painter(this);

    if(mainWin->NUM_Win == 1){
    //参数: 1: x; 2: y; 3:被绘制的图片
        painter.drawPixmap(0,0,QPixmap(qApp->applicationDirPath()+"/skin/left1.png"));
    }else if(mainWin->NUM_Win == 2){
        painter.drawPixmap(581,0,QPixmap(qApp->applicationDirPath()+"/skin/right1.png"));
    }else if(mainWin->NUM_Win == 3){
        painter.drawPixmap(0,62,QPixmap(qApp->applicationDirPath()+"/skin/left2.png"));
    }else if(mainWin->NUM_Win == 4){
        painter.drawPixmap(581,62,QPixmap(qApp->applicationDirPath()+"/skin/right2.png"));
    }
}
以上用的图片是四个尖角:就是四个角  可以根据需求进行调整(具体看代码注释)

在这里插入图片描述

5、以上就是实现了单击后出现一个包含表格的窗口 并且根据需求带角

6、以上用到了

1.窗口坐标与屏幕坐标的交互
2.屏幕的边框(x ? 最小放大)取消
3.屏幕的透明度
4.表格的添加

具体可以L_taxy@163.com联系 一起学习 谢谢观看~~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光顶术士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值