您的位置:首页 > 编程语言 > Qt开发

Qt之定时器、重绘窗口、窗口缩放、截屏、截图

2017-05-24 20:00 211 查看
--------------- MyWidget.h ------------
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include<QMouseEvent>
#include <QWidget>

class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = 0);
//重载一个函数,基类中该函数是一个虚函数;因此重载该函数之后发生多态操作;
void mousePressEvent(QMouseEvent *ev);
//所有的这些事件都有一个共同的父类,QEvent;
//移动窗口
void mouseMoveEvent(QMouseEvent *ev);
//鼠标释放
void mouseReleaseEvent(QMouseEvent *ev);

/************************/
//判断键盘有无按键按下
void keyPressEvent(QKeyEvent *ev);
//重绘窗口
void paintEvent(QPaintEvent *ev);
//窗口缩放
void resizeEvent(QResizeEvent *ev);
//定时器消息
void timerEvent(QTimerEvent *ev);
//所有发给MyWidget对象的event,都会经过event函数
bool event(QEvent *ev);
int T1;
int T2;
//鼠标原始位置
QPoint posMouseOrigin;

signals:

public slots:

};

#endif // MYWIDGET_H

--------------- MyWidget.cpp ------------
#include "mywidget.h"
#include<QDebug>
#include<QApplication>
#include<QWidget>
#include<QScreen>
#include<QPixmap>
#include<QPoint>
#include<QEvent>
#include<QPainter>
#include<QMouseEvent>
MyWidget::MyWidget(QWidget *parent) :
QWidget(parent)
{
this->setWindowFlags(Qt::FramelessWindow     Hint); //去掉标题栏;
T1 = startTimer(1000);//设置时钟定时器
T2 = startTimer(5000); //5000ms
}

//获取鼠标的按下操作
void MyWidget::mousePressEvent(QMouseEvent *ev)
{
this->posMouseOrigin = QCursor::pos(); //cursor是一个光标类;

}

//获得鼠标移动的操作
void MyWidget::mouseMoveEvent(QMouseEvent *ev)
{
QPoint ptMouseNow = QCursor::pos();
QPoint ptDelta = ptMouseNow - this->posMouseOrigin;
move(this->pos() + ptDelta);
posMouseOrigin = ptMouseNow;
}

//获得鼠标的释放操作;
void MyWidget::mouseReleaseEvent(QMouseEvent *ev)
{

}

//键盘按下事件(键盘消息)
void MyWidget::keyPressEvent(QKeyEvent *ev)
{

/*判断按下的键值,按下小写/大写-->大写
*数字则仍然按照ASCII规则,某些键是无法
* 用ASCII键表示,如Enter,Shift...
*/
qDebug()<<ev->key();
//判断是否友伴随这ctrl键
qDebug()<<ev->modifiers();
//判断是第一个按下的值还是后面连续的值
qDebug()<<ev->isAutoRepeat();
}

//重绘窗口
void MyWidget::paintEvent(QPaintEvent *ev)
{
QPainter p(this);
//画一条直线(两点确定一条直线)
p.drawLine(QPoint(0,0),QPoint(200,200));

}

//窗口放大、缩小
void MyWidget::resizeEvent(QResizeEvent *ev)
{

}

//定时器消息
void MyWidget::timerEvent(QTimerEvent *ev)
{
//允许同时有多个信号产生,不同的信号返回值不同;
if(T1 == ev->timerId())
{
qDebug()<<"T1 time out.";
} else if(T2 == ev->timerId())
{
qDebug()<<"T2 time out.";
killTimer(T2);  //销毁定时器T2
}
qDebug()<<"Time Out. ";
}

//所有发给MyWidget对象的event,都会经过event函数
bool MyWidget::event(QEvent *ev)
{
//判断鼠标是否被按下
if(ev->type()==QEvent::MouseButtonPress )
{
qDebug()<<"Mouse press in event.";
}
//将消息处理流程,还给Qt框架
return QWidget::event(ev);
}

//窗口截屏:点击鼠标完成截图操作
void MyWidget::paintEvent(QPaintEvent *ev)
{
QPixmap pixmap(width(),height());
QPainter p;
this->render(&pixmap);
pixmap.save("D:\\code\\1.png");
}

//截屏(仍是截图操作)操作
void MyWidget::paintEvent(QPaintEvent *ev)
{
//QList<QScreen*> screen = app->screens();  //多屏(分屏)
QScreen *screen = qApp->primaryScreen(); //主屏
QPixmap pixmap = screen->grabWindow(this->winId());//可以截窗口
pixmap.save("D:\\code\\1.png");
}

//截屏(整个屏幕) #include<QDesktopWidget>
void MyWidget::paintEvent(QPaintEvent *ev)
{
//主屏
QScreen *screen = qApp->primaryScreen();
//代表桌面的窗口
QDesktopWidget *desktop = qApp->desktop();
//截屏
QPixmap pixmap = screen->grabWindow(desktop->winId());
pixmap.save("D:\\code\\1.png");
}

--------------- main.c ------------------

#include<QApplication>
#include<QWidget>
#include<QDebug>
#include"mywidget.h"
int main(int argc,char **argv)
{
QApplication app(argc,argv);
//功能新的需求:不再使用框架提供的窗口,自定义一个窗口;
//派生类;
MyWidget w;  //MyWidget类继承于基类QWidget类;
w.show();
return app.exec();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: