本文的目的是创建一个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());
}
鼠标离开按钮区: