Qt:自定义进度条
来源:互联网 发布:日历制作软件 编辑:程序博客网 时间:2024/05/27 12:20
头文件:
floatwindows.h
#ifndef FLOATWINDOWS_H#define FLOATWINDOWS_H#include <QWidget>#include <QtGui>class FloatWindows : public QWidget{ Q_OBJECTpublic: 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_Hfollowwindows.h
#ifndef FOLLOWWINDOWS_H#define FOLLOWWINDOWS_H#include <QWidget>#include <QtGui>class FollowWindows : public QWidget{ Q_OBJECTpublic: explicit FollowWindows(QWidget *parent = 0); void setText(const QString& text);signals:public slots:private: void paintEvent(QPaintEvent *event); QString m_text;};#endif // FOLLOWWINDOWS_Hmainwindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include "followwindows.h"namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{ Q_OBJECTpublic: 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;}设计界面:
运行效果:
阅读全文
0 0
- QT自定义进度条ProgressBar
- Qt:自定义进度条
- Qt自定义进度条
- Qt自定义进度条
- Qt之模型/视图(自定义进度条)
- QT自定义控件:CircleProgressBar环形进度条
- Qt进度条
- QT进度条
- Qt进度条
- qt 进度条
- Qt进度条
- qt slider scroll bar 进度条 自定义(通过style sheet)
- Qt自定义控件之进度条(代码实现)
- 自定义进度条
- 自定义进度条
- 自定义进度条
- 自定义进度条
- 自定义进度条
- 闵神的数论
- 类的概述·main方法中参数String[] argv的意义讲解
- 主成分分析(PCA)
- python基础系列教程——python中的字符串和正则表达式全解
- CentOS 7安装Python3.5
- Qt:自定义进度条
- 找新朋友(欧拉定理)
- 不想提交表单但是想利用表单校验功能
- 汇编语言-输出HelloWorld
- ftpd服务常见配置总结(/etc/vsftpd/vsftpd.conf)
- 使用sklearn之LabelEncoder将Label标准化
- 前端之nodejs(五)
- UVa12230
- BufferedReader应用