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

来源:互联网 发布:文字复制软件 编辑:程序博客网 时间:2024/06/01 07:55
--------------- MyWidget.h ------------#ifndef MYWIDGET_H#define MYWIDGET_H#include<QMouseEvent>#include <QWidget>class MyWidget : public QWidget{    Q_OBJECTpublic:    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();}
原创粉丝点击