我正在尝试创建一个动态 QSlider,它接受整数值的 QVector 并将它们映射到 QSlider 下相对于它们所代表的位置。
这是我现在拥有的屏幕截图: 我的滑块 http://dev.kyleswebspace.com/images/QInteractiveSlider.jpg
如您所见,刻度与它们的值不一致。这是问题之一。
不过,我正在努力解决的主要问题是,无论我将 PADDING 值更改为什么(请参阅 qinteractiveslider.h),我的小部件中的 QSlider 相对于值网格保持相同的大小。
- 为什么我的 QGridLayout 的参数不能提供正确的填充量?
- 如何在 QSlider 上强制执行这些边距?
- 有没有更好的方法来定位这些标签?我愿意接受建议。
这是代码:
qinteractiveslider.h
#ifndef QINTERACTIVESLIDER_H
#define QINTERACTIVESLIDER_H
#include <QtGui/QGridLayout>
#include <QtGui/QLabel>
#include <QtGui/QSlider>
#include <QtGui/QWidget>
class QInteractiveSlider : public QWidget
{
Q_OBJECT
public:
QInteractiveSlider(QVector<int>* values, int min, int max, QWidget *parent = 0, Qt::WFlags flags = 0);
~QInteractiveSlider();
private:
static const int GRID_WIDTH = 10000;
static const int PADDING = GRID_WIDTH / 3;
QGridLayout* m_layout;
QSlider* m_slider;
QVector<int>* m_values;
};
qinteractiveslider.cpp
#include "qinteractiveslider.h"
QInteractiveSlider::QInteractiveSlider(QVector<int>* values, int min, int max, QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags)
{
m_layout = new QGridLayout();
m_layout->setSpacing(0);
m_slider = new QSlider(Qt::Horizontal);
m_slider->setTickInterval(25);
m_slider->setTickPosition(QSlider::TicksBelow);
m_layout->addWidget(m_slider, 0, PADDING, 1, GRID_WIDTH - PADDING, Qt::AlignBottom);
//populate bottom row with labels
QVector<int>::Iterator iterator = values->begin();
while(iterator != values->end()) {
//place the label at the relative position under the slider
int columnIndex = ((double)*iterator / (double)max) * (double)GRID_WIDTH;
QString labelString = QString::number(*iterator);
QLabel* label = new QLabel(labelString);
m_layout->addWidget(label, 1, columnIndex, 1, 1, Qt::AlignTop);
iterator++;
}
this->setLayout(m_layout);
}
QInteractiveSlider::~QInteractiveSlider()
{
}
主文件
#include "qinteractiveslider.h"
#include <QtGui/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QVector<int>* testVector = new QVector<int>();
testVector->append(0);
testVector->append(50);
testVector->append(25);
testVector->append(100);
QInteractiveSlider* w = new QInteractiveSlider(testVector, 0, 100);
w->show();
return a.exec();
}