qt--创建可隐藏的按钮

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liji_digital/article/details/52818782

本文的目的是创建一个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_OBJECT

public:
    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());
}


鼠标进入按钮区:

鼠标离开按钮区:



展开阅读全文

没有更多推荐了,返回首页