说明
Qt可以比较方便地实现自定义控件在Qt Creator中使用。网上也有很多大神的控件可以使用,但是如果想要自己简单定制也可以按照这个流程。
本文的要点:
【1】如何实现一个自定义控件?
本文使用的方法有两个步骤:
- 先在一个普通项目中实现使用
- 新建Qt Ui控件项目编译成dll和相关lib
【2】自定义控件如何在多个环境下使用?
- Qt Creator只认自己相匹配的库
- 代码中可以使用多个环境的库,前提是要编译链接好相关库。
因此,文章也分两方面去阐述,第一部分编写,和第二部分使用。
第一部分:编写
1、在普通项目中使用
首先,新建一个QWidget项目。
界面上拖拽一个文字显示框(QPlainTextEdit)和一个垂直滑块(QSlider)如图:
然后,新建一个类MySlider,继承于QSlider,Q_OBJECT宏记得要加上。
#ifndef MYSLIDER_H
#define MYSLIDER_H
#include <QSlider>
#include <atomic>
class MySlider : public QSlider
{
Q_OBJECT
public:
MySlider(QWidget *parent = nullptr);
protected:
void paintEvent(QPaintEvent *ev) override;
void mousePressEvent(QMouseEvent *ev) override;
void mouseReleaseEvent(QMouseEvent *ev) override;
void mouseMoveEvent(QMouseEvent *ev) override;
private:
std::atomic_bool mValiedMouseFlag{false};
std::atomic_int mSilderUp{0};
};
#endif // MYSLIDER_H
重写的几个方法可以点击到头文件里查看哪些用得到需要重写:
这里重写的是:
void paintEvent(QPaintEvent *ev) override; //绘制控件
void mousePressEvent(QMouseEvent *ev) override; //鼠标按下
void mouseReleaseEvent(QMouseEvent *ev) override; //鼠标松开
void mouseMoveEvent(QMouseEvent *ev) override; //鼠标移动
还有需要注意的是在protected区域的对象虽然重写在public也可以运行,也要保持不改,因为编译成控件以后有可能会不识别。
至于下面的两个变量:
-
mValiedMouseFlag用于保存鼠标按下状态(对于一些关键的变量习惯用atom 可以改成普通的bool类型)
-
mSilderUp用于保存按下鼠标时,鼠标指针离滑块顶部的距离(对于一些关键的变量习惯用atom 可以改成普通的int类型)
然后开始在cpp内实现几个方法,首先是绘图:
//滑块高度固定40
const int heightSlider = 40;
void MySlider::paintEvent(QPaintEvent *ev)
{
Q_UNUSED(ev);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing,true);
QRect rect = QRect(4,4,this->width()-8,this->