頭檔案:
floatwindows.h
#ifndef FLOATWINDOWS_H
#define FLOATWINDOWS_H
#include <QWidget>
#include <QtGui>
class FloatWindows : public QWidget
{
Q_OBJECT
public:
explicit FloatWindows(QWidget *parent = 0);
signals:
void clicked(int progress);
void tracking(int progress, QPoint pos);
void hightlight(bool states);
public:
void setRange(int range);
void setProgress(int progress);
int Range() const;
int Progress() const;
public slots:
private:
QSize sizeHint() const; //大小提示
void enterEvent(QEvent *event);//滑鼠移進
void leaveEvent(QEvent *event);//滑鼠移出
void mouseMoveEvent(QMouseEvent *event);//滑鼠移動
void mousePressEvent(QMouseEvent *event);//滑鼠點選
void mouseReleaseEvent(QMouseEvent *event);//滑鼠擡起
void paintEvent(QPaintEvent *event);
private:
int Postion_To_Progress(int postion);
int Progress_To_Postion(int progress);
private:
int m_Range; //進度條範圍
int m_Progress; //進度
bool m_HightLight; //是否高亮狀态
bool m_Pressed; //滑鼠是否點選狀态
};
#endif // FLOATWINDOWS_H
followwindows.h
#ifndef FOLLOWWINDOWS_H
#define FOLLOWWINDOWS_H
#include <QWidget>
#include <QtGui>
class FollowWindows : public QWidget
{
Q_OBJECT
public:
explicit FollowWindows(QWidget *parent = 0);
void setText(const QString& text);
signals:
public slots:
private:
void paintEvent(QPaintEvent *event);
QString m_text;
};
#endif // FOLLOWWINDOWS_H
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "followwindows.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
int OnSeekHightLight(bool states);
int OnSeekClicked(int progress);
int OnSeekTracking(int progress,QPoint pos);
private:
Ui::MainWindow *ui;
FollowWindows *m_Tooltip;
};
#endif // MAINWINDOW_H
源檔案:
floatwindows.cpp
#include "floatwindows.h"
FloatWindows::FloatWindows(QWidget *parent) :
QWidget(parent)
{
m_Range = 100;
m_Progress = 0;
m_HightLight = false;
m_Pressed = false;
setMouseTracking(true);//設定滑鼠跟蹤
setCursor(Qt::PointingHandCursor);//設定光标為手型
}
void FloatWindows::setRange(int range)
{
m_Range = range;
update();
}
void FloatWindows::setProgress(int progress)
{
m_Progress = progress;
update();
}
int FloatWindows::Range() const
{
return m_Range;
}
int FloatWindows::Progress() const
{
return m_Progress;
}
QSize FloatWindows::sizeHint() const
{
return QSize(100,20);
}
void FloatWindows::enterEvent(QEvent *event)
{
m_HightLight = true; //滑鼠移進時,進度條高亮顯示
update();
emit hightlight(true);
QWidget::enterEvent(event);//調用父類函數保持原有行為
}
void FloatWindows::leaveEvent(QEvent *event)
{
m_HightLight = false;
update();
emit hightlight(false);
QWidget::leaveEvent(event);
}
void FloatWindows::mouseMoveEvent(QMouseEvent *event)
{
int progress = Postion_To_Progress(event->pos().x());
emit tracking( progress,event->pos() );
QWidget::mouseMoveEvent(event);
}
void FloatWindows::mousePressEvent(QMouseEvent *event)
{
if(event->buttons() == Qt::LeftButton)
{
m_Pressed = true;
}
}
void FloatWindows::mouseReleaseEvent(QMouseEvent *event)
{
if(m_Pressed)
{
m_Pressed = false;
m_Progress = Postion_To_Progress(event->pos().x());
update();
emit clicked(m_Progress);
}
}
void FloatWindows::paintEvent(QPaintEvent *event)
{
QWidget::paintEvent(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);//設定渲染,反鋸齒
int width = this->width()-20;
int height = this->height();
int middel = height/2;
int ofset = 0;
QColor colorLeft = QColor(44, 143, 214);
QColor colorRight = QColor(0x888888);
QColor colorHandle = QColor(51, 153, 255);//小球背景色
QColor colorHandleFrame = QColor(0xCCCCCC);
int postion = ofset + m_Progress * width/m_Range;
if(!m_HightLight)
{
//細線模式
QPen pen;
pen.setWidth(2);//線寬
//左邊
pen.setColor(colorLeft);
painter.setPen(pen);
painter.drawLine(QPoint(0,middel),QPoint(postion,middel));
//右邊
pen.setColor(colorRight);
painter.setPen(pen);
painter.drawLine(QPoint(postion,middel),QPoint(width,middel));
//小圓球
pen.setWidth(1);
pen.setColor(colorHandleFrame);
painter.setPen(pen); //描線
painter.setBrush(colorHandle);//背景填充色
painter.drawEllipse(QPoint(postion+5,middel),5,5);//進度條上小球大小
}
else
{
//粗線模式
QPen pen;
pen.setWidth(4);//線寬
//左邊
pen.setColor(colorLeft);
painter.setPen(pen);
painter.drawLine(QPoint(0,middel),QPoint(postion,middel));
//右邊
pen.setColor(colorRight);
painter.setPen(pen);
painter.drawLine(QPoint(postion,middel),QPoint(width,middel));
//粗線模式圓球變化
pen.setWidth(1);
pen.setColor(colorHandleFrame);
painter.setPen(pen); //描線
painter.setBrush(colorHandle);//背景填充色
int w = 20,h = 10;
QRect rectHandel(postion,middel-h/2,w,h);
//繪制圓角矩形
painter.drawRoundedRect(rectHandel,4,4);//最後兩個參數決定角的圓度
}
}
int FloatWindows::Postion_To_Progress(int postion)
{
int width = this->width()-20;
int ofset = 10;
postion -= ofset; //可不加這句,隻是為了防止界面越界
if(postion < 0)
{
postion = 0;
}
else
if(postion > width)
{
postion = width;
}
return postion * m_Range/width;
}
int FloatWindows::Progress_To_Postion(int progress)
{
int width = this->width()-20;
int ofset = 10; //ofset可不加這句,隻是為了防止界面越界
return ofset + width*progress/m_Range;
}
followwindows.cpp
#include "followwindows.h"
FollowWindows::FollowWindows(QWidget *parent) :
QWidget(parent)
{
setWindowFlags(Qt::ToolTip); //設定視窗為提示框
setAttribute(Qt::WA_TranslucentBackground);//半透明
}
void FollowWindows::setText(const QString &text)
{
m_text = text;
update();
}
void FollowWindows::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);//設定渲染,反鋸齒
// 背景透明
int w = width(), h = height();
painter.setPen(QColor(0,0,0,0));
painter.setBrush(QColor(0xFF,0xFF,0xFF,0xAA));
//painter.setBrush(QColor(0xFF,0xFF,0xFF));
painter.drawRect(0,0,w,h);
// 顯示文本:所選區域的大小
QFont font = painter.font();
font.setPixelSize(14);//字型顯示大小
painter.setFont(font);
painter.setPen(QPen(QColor(0x33,0X33,0X33)));
QRect textRect(0,0, w, h);
painter.drawText(textRect, Qt::AlignCenter, m_text);
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_Tooltip = new FollowWindows(this);
m_Tooltip->setFixedSize(60,20);
m_Tooltip->hide();
connect(ui->widget,SIGNAL(hightlight(bool)),
this,SLOT(OnSeekHightLight(bool)));
connect(ui->widget,SIGNAL(clicked(int)),
this,SLOT(OnSeekClicked(int)));
connect(ui->widget,SIGNAL(tracking(int,QPoint)),
this,SLOT(OnSeekTracking(int,QPoint)));
}
MainWindow::~MainWindow()
{
delete ui;
}
int MainWindow::OnSeekHightLight(bool states)
{
m_Tooltip->setVisible(states);
return 0;
}
int MainWindow::OnSeekClicked(int progress)
{
Q_UNUSED(progress);//不引用
return 0;
}
int MainWindow::OnSeekTracking(int progress, QPoint pos)
{
char buf[64];
sprintf(buf,"%d",progress);
m_Tooltip->setText(buf);
pos.setY(-25);
pos.setX(pos.x()-30);
pos = ui->widget->mapToGlobal(pos);//全局位置
m_Tooltip->move(pos);
return 0;
}
設計界面:

運作效果: