一、自定義Widget組件
1、自定義Widget組件
使用步驟
- 采用提升法(promotion)
- 重新定義paintEvent事件
2、實現程序
(1)創建項目,基于QWidget
(2)添加類,為Widget組件提升類
#include "battery.h"
#include <QPainter>int Battery::powerLevel() const
{return mPowerLevel;
}void Battery::setPowerLevel(int powerLevel)
{mPowerLevel = powerLevel;repaint();
}void Battery::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 120, 50); // 設置窗口邏輯坐標painter.setRenderHint(QPainter::Antialiasing);painter.setRenderHint(QPainter::TextAntialiasing);// 繪制電池邊框QPen pen;pen.setWidth(2);pen.setColor(mColorBorder);pen.setStyle(Qt::SolidLine);pen.setCapStyle(Qt::FlatCap);pen.setJoinStyle(Qt::BevelJoin);painter.setPen(pen);QBrush brush;brush.setColor(mColorBack);brush.setStyle(Qt::SolidPattern);painter.setBrush(brush);rect.setRect(1, 1, 109, 48);painter.drawRect(rect);brush.setColor(mColorBorder);painter.setBrush(brush);rect.setRect(110, 15, 10, 20);painter.drawRect(rect);// 畫電量if(mPowerLevel <= mWarning){brush.setColor(mColorWarning);pen.setColor(mColorWarning);}else{brush.setColor(mColorPower);pen.setColor(mColorPower);}painter.setBrush(brush);painter.setPen(pen);if(mPowerLevel > 0){rect.setRect(5, 5, mPowerLevel, 40);painter.drawRect(rect);}// 繪制百分比文字QFontMetrics textSize(this->font());QString powerStr = QString::asprintf("%d%%", mPowerLevel);QRect textRect = textSize.boundingRect(powerStr);pen.setColor(mColorBorder);painter.setPen(pen);painter.drawText(55 - textRect.width() / 2, 23 + textRect.height() / 2, powerStr);}Battery::Battery(QWidget *parent) : QWidget(parent)
{}
(3)設置標題和圖標(圖標需要選擇資源中圖標,直接選擇文件可能無效)
(4)實現電池電量修改
#include "widget.h"
#include "ui_widget.h"#include "battery.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);ui->battery->setPowerLevel( ui->horizontalSlider->value() );
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{int nPower = ui->horizontalSlider->value();ui->battery->setPowerLevel(nPower);ui->label->setText(QString::asprintf("當前電量: %d%%", nPower));
}
二、自定義QtDesigner插件
1、實現程序
(1)創建自定義控件工程
設置分組
(2)將生成的dll庫拷貝到Tools\QtCreator\bin\plugins\designer下
(3)創建項目,基于QWidget
在UI編輯界面組件欄可以看到多分組MyWidget下有了Battery組件。(我沒做出來,始終是加載失敗,之后測試處理)
初步分析:似乎因為Qt IDE是由MSVC編譯,所以插件必須為MSVC編譯(本人使用MSVC2015 64bit測試,沒有加載成功,之后測試32bit)
三、靜態鏈接庫
1、靜態鏈接庫的創建和使用
(1)創建靜態鏈接庫
- MSVC編譯器生成的庫后綴為“.lib”
- MinGW編譯器生成的庫后綴為".a"
(2)使用靜態庫
需要使用靜態庫文件和h文件,不需要cpp文件
2、實現程序
(1)創建Library項目
(2)使用圖表中的一個窗口
(3)創建項目調用庫
(4)添加庫
(5)實現功能
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogpen.h"#include <QPainter>void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 100, 50); // 邏輯坐標painter.setPen(mPen);painter.drawRect(10, 10, 80, 30);
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actSetPen_triggered()
{bool ok = false;QPen pen = DialogPen::getPen(mPen, ok);if(ok){mPen = pen;repaint();}
}
四、共享庫(動態鏈接庫)
1、動態庫聲明
(1)隱式加載
#if defined(DLL_LIBRARY)
#define DLLSHARED_EXPORT Q_DECL_EXPORT
#else
#define DLLSHARED_EXPORT Q_DECL_IMPORT
#endif
(2)顯示加載(直接打開dll庫,直接解析調用函數)
typedef int (*FunDef)(int);FunDef myFun = (FunDef)myLib.resolve("funName"); //解析dll函數
int n = myFun(1); //調用函數
2、實現隱式加載程序
(1)創建動態庫工程
(2)導出動態庫
class SHAREDLIBSHARED_EXPORT DialogPen : public QDialog
(3)實現功能
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogpen.h"#include <QPainter>void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 100, 50); // 邏輯坐標painter.setPen(mPen);painter.drawRect(10, 10, 80, 30);
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actSetPen_triggered()
{bool ok = false;QPen pen = DialogPen::getPen(mPen, ok);if(ok){mPen = pen;repaint();}
}