qt--创建可隐藏的按钮

来源:互联网 发布:mac上炒股软件 编辑:程序博客网 时间:2024/05/21 17:16

本文的目的是创建一个widget,widget显示一张莱纳图,此外widget还有一个按钮。这个按钮平时隐藏,仅当光标悬停在其上超过1秒时,才会显示。当光标拿开,按钮又隐藏。

思路是1)用QImage载入莱纳图,重写虚函数paintEvent把莱娜图显示在widget上面。

2)用setVisibility来控制按钮的显示/隐藏。

3)启动定时器m_timer,每隔0.1秒触发一次OnTimeOut槽函数。每触发一次,程序就会检查光标是否处于按钮占据的空间内。假如是,成员m_iTick就增加一。假如m_iTick == 10,即光标累积停留在按钮区域内超过一秒,按钮就会浮现出来。假如光标离开了按钮区,按钮被隐藏,且m_iTick = 0.


下面是代码:

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QImage>#include <QPushButton>#include <QPaintEvent>#include <QTimer>#include <QPainter>class MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = 0);    ~MainWindow();    QImage              m_imgBKG;    QPushButton     *   m_pBtn;    QTimer              m_timer;    int                 m_iTick;    QPoint              m_pntPrev;    QPoint              m_pntCurrent;public slots:    void                OnTimeOut(void);protected:    void    paintEvent(QPaintEvent *);    void    resizeEvent(QResizeEvent *);};#endif // MAINWINDOW_H

#include "mainwindow.h"#include <QDebug>#include <QCursor>#include <QMessageBox>#include <QTextStream>MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    m_pntPrev = QPoint(-100,-100);    m_iTick = 0;    setGeometry(500, 100, 500, 300);    m_pBtn = new QPushButton("yello",this);    m_pBtn->setGeometry(100, 100, 50, 50);    m_pBtn->setVisible(false);    bool b = m_imgBKG.load("E:\\lena.jpg");    qDebug()<<(int)b;    m_timer.setInterval(100);    QObject::connect(&m_timer, SIGNAL(timeout()), this, SLOT(OnTimeOut()));    m_timer.start();}MainWindow::~MainWindow(){    m_timer.stop();    delete m_pBtn;}void MainWindow::paintEvent(QPaintEvent *e){    QPainter qp;    qp.begin(this);    qp.setBrush(QBrush(m_imgBKG));    qp.drawRect(rect());        //qp.drawImage(e->rect(), m_imgBKG);    qp.end();}void MainWindow::OnTimeOut(void){    m_pntCurrent = QCursor::pos();    m_pntCurrent = mapFromGlobal(m_pntCurrent);    if(!m_pBtn->isVisible())    {        if(m_pBtn->geometry().contains(m_pntCurrent))        {            m_iTick++;            if(10 == m_iTick)            {                m_pBtn->setVisible(true);            }        }        else        {            m_iTick = 0;        }    }    else    {        if(!m_pBtn->geometry().contains(m_pntCurrent))        {            m_pBtn->setVisible(false);            m_iTick = 0;        }    }}void MainWindow::resizeEvent(QResizeEvent *e){    m_imgBKG = m_imgBKG.scaled(width(), height());}


鼠标进入按钮区:

鼠标离开按钮区:



0 0
原创粉丝点击