QT 绘制电池
label设置字体,居中
QFont font("Times", 18, QFont::Bold); ui->label->setFont(font); //设置字体 ui->label->setAlignment(Qt::AlignCenter); //居中对齐 ui->label->setText("Hello"); //文字
今天在运行程序时发现CPU占用了30%左右,这就十分的消耗CPU了,于是检查代码,发现居然是自己把设置字体的代码放入了QPaintEvent事件当中,然后把它修改成全局,再次运行代码,CPU占用率立马下降,只有1%左右。
第一步:设置label大小
ui->label->setFixedSize(300, 200);
第二步:给label设置事件过滤器,this指针指定当事件发生时调用当前类中的事件过滤器进行处理
ui->label->installEventFilter(this);//在label上安装事件过滤器,this指针指定当事件发生时调用当前类中的事件过滤器进行处理
第三步:实现bool eventFilter(QObject *watched, QEvent *event);函数
bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if(watched == ui->label && event->type() == QEvent::Paint) { paint(); } return QMainWindow::eventFilter(watched, event); }
第四步:实现画图函数
QPainter paint(ui->label); paint.setPen(QPen(QColor(136, 205, 112), 2)); paint.drawRect(0,0, 200, 140); paint.setBrush(QColor(137, 249, 83)); paint.drawRoundedRect(200, 40,20,60,2,2);
完整代码:
.h文件
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void setValue(int value); void paint(); bool eventFilter(QObject *watched, QEvent *event); private: Ui::MainWindow *ui; double m_value; double max_value; }; #endif // MAINWINDOW_H
.cpp文件
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QPainter> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { max_value = 200; ui->setupUi(this); ui->label->setFixedSize(300, 200); ui->label->installEventFilter(this);//在label上安装事件过滤器,this指针指定当事件发生时调用当前类中的事件过滤器进行处理 setValue(100); } MainWindow::~MainWindow() { delete ui; } void MainWindow::setValue(int value) { m_value = value/15; update(); } bool MainWindow::eventFilter(QObject *watched, QEvent *event) { if(watched == ui->label && event->type() == QEvent::Paint) { paint(); } return QMainWindow::eventFilter(watched, event); } void MainWindow::paint() { QPainter paint(ui->label); paint.setPen(QPen(QColor(136, 205, 112), 2)); paint.drawRect(0,0, 200, 140); paint.setBrush(QColor(137, 249, 83)); paint.drawRoundedRect(200, 40,20,60,2,2); paint.setBrush(QColor(137, 249, 83)); paint.drawRect(0, 0, m_value, 140); }
当然这个程序是个半成品,我这里的m_value是已经固定了的,在实际情况下应该是根据实际情况自动改变m_value的值,你应该实现一个函数每隔多少分钟向setValue()函数传输一个值来不断的更新你写的电池,最简单的是你写个定时器函数timer,每隔多少分钟传输一次数据。