最近公司项目要用到滚动条,而且要性能非常好,因为图像可能非常大,widget的面积可能几万像素,看了QScrollArea、QAbstractScrollArea设计,太过复杂,
而QListView QTableView QTableWidget等直接或间接继承QAbstractScrollArea,其他很多控件类也直接或间接继承QAbstractScrollArea,
为了摆脱QScrollArea的viewport和其分离的设计,以使用Windows下GDI开发,我决定自己写一个继承自qwidget的子类带QScrollBar,在代码里面控制其位置和显示隐藏特性
自己的widget重载了resizeEvent函数,添加scrollbar的信号槽,上代码:
//CWidget.h
#include <QtWidgets/QMainWindow>
#include <QScrollBar>
#include <QAbstractSlider>
#include <QResizeEvent>
class CWidget : public QWidget
{
Q_OBJECT
public:
CWidget(QWidget* parent = 0);
~CWidget();
private:
QScrollBar* vscrollbar;
QScrollBar* hscrollbar;
private slots:
void valueChangedScrollBar(int value);
protected:
void resizeEvent(QResizeEvent* event);
};
//CWidget.cpp
CWidget::CWidget(QWidget* parent)
: QWidget(parent)
{
vscrollbar = new QScrollBar(Qt::Vertical, this);
vscrollbar->setRange(0, 100);
hscrollbar = new QScrollBar(Qt::Horizontal, this);
hscrollbar->setRange(0, 100);
connect(vscrollbar, SIGNAL(valueChanged(int)), this, SLOT(valueChangedScrollBar(int)));
}
void CWidget::valueChangedScrollBar(int value)
{
//滚动位置value,通过控制显示图像内容
}
void CWidget::resizeEvent(QResizeEvent* e)
{
QSize qsize = e->size();
QSize qsize = e->size();
//滚动条宽高都为20
vscrollbar->setGeometry(qsize.width() - 20, 0, 20, qsize.height() - 20);
hscrollbar->setGeometry(0, qsize.height() - 20, qsize.width() - 20, 20);
}
CWidget::~CWidget()
{
}
//看效果图