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联系 一起学习 谢谢观看~~~