我正在尝试创建一个动态QSlider,它接受一个整数值的QVector,并将它们映射到QSlider下面相对于它们所代表的位置。
这是我现在拥有的截图: My Slider http://dev.kyleswebspace.com/images/QInteractiveSlider.jpg
正如您所看到的,刻度线与它们的值不对齐。这是其中一个问题。
我正在努力解决的主要问题是,无论我将PADDING值更改为(请参阅qinteractiveslider.h),我的窗口小部件中的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()
{
}
的main.cpp
#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();
}
答案 0 :(得分:1)
我无法直接回答第1和第2个问题。 单独显示数字是个坏主意。从现在开始,您必须知道手动显示数字的位置。这不是非常便携并且破坏了封装。它也可能无法正确缩放以改变QSlider尺寸。 由于QSlider没有提供在刻度下显示数字的选项,您应该扩展QSlider并重写paint()函数或使用QWT。 http://qwt.sourceforge.net/class_qwt_slider.html
答案 1 :(得分:1)
我不确定网格布局是解决此问题的最佳方式。
首先,我会让滑块自行处理 - 在布局中。然后,最重要的工作就是将标签放在应该去的地方。
不是使用布局,我只是将标签添加到父QWidget,然后调用
QWidget :: move(int x,int y)
但是,这只会在第一次使用,但由于您在QWidget(自定义控件)中非常好地隔离,因此您可以在父级调整大小时重新调整标签位置,如下所示:
void QInteractiveSlider::resizeEvent(QResizeEvent *event)
{
QWidget::resizeEvent(event);
// Loop through the labels and adjust their location.
label->move(...);
}
这应该可以解决问题。
如果您遇到任何问题,请告诉我们,我们会看到我们可以做些什么。
答案 2 :(得分:0)
你也可以使用QHBoxLayouts的组合,这样你就可以正确地放置东西而不会有太多的边缘麻烦。
以下代码生成的屏幕截图如下:
通过在标签上放置最大宽度,可以使它更漂亮。这样你就可以避免必须将左对齐设置为右对齐。
#ifndef DESIGNERLS7532_H
#define DESIGNERLS7532_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHBoxLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QSlider>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>
QT_BEGIN_NAMESPACE
class Ui_Form
{
public:
QVBoxLayout *verticalLayout;
QWidget *widget;
QHBoxLayout *horizontalLayout;
QSlider *horizontalSlider;
QWidget *widget_2;
QHBoxLayout *horizontalLayout_2;
QLabel *label;
QLabel *label_4;
QLabel *label_2;
QLabel *label_5;
QLabel *label_3;
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
Form->setObjectName(QString::fromUtf8("Form"));
Form->resize(268, 55);
verticalLayout = new QVBoxLayout(Form);
verticalLayout->setSpacing(0);
verticalLayout->setContentsMargins(0, 0, 0, 0);
verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
widget = new QWidget(Form);
widget->setObjectName(QString::fromUtf8("widget"));
horizontalLayout = new QHBoxLayout(widget);
horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
horizontalLayout->setContentsMargins(-1, -1, -1, 0);
horizontalSlider = new QSlider(widget);
horizontalSlider->setObjectName(QString::fromUtf8("horizontalSlider"));
horizontalSlider->setOrientation(Qt::Horizontal);
horizontalSlider->setTickPosition(QSlider::TicksBelow);
horizontalLayout->addWidget(horizontalSlider);
verticalLayout->addWidget(widget);
widget_2 = new QWidget(Form);
widget_2->setObjectName(QString::fromUtf8("widget_2"));
horizontalLayout_2 = new QHBoxLayout(widget_2);
horizontalLayout_2->setObjectName(QString::fromUtf8("horizontalLayout_2"));
horizontalLayout_2->setContentsMargins(-1, 0, -1, -1);
label = new QLabel(widget_2);
label->setObjectName(QString::fromUtf8("label"));
horizontalLayout_2->addWidget(label);
label_4 = new QLabel(widget_2);
label_4->setObjectName(QString::fromUtf8("label_4"));
label_4->setAlignment(Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter);
horizontalLayout_2->addWidget(label_4);
label_2 = new QLabel(widget_2);
label_2->setObjectName(QString::fromUtf8("label_2"));
label_2->setAlignment(Qt::AlignCenter);
horizontalLayout_2->addWidget(label_2);
label_5 = new QLabel(widget_2);
label_5->setObjectName(QString::fromUtf8("label_5"));
label_5->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
horizontalLayout_2->addWidget(label_5);
label_3 = new QLabel(widget_2);
label_3->setObjectName(QString::fromUtf8("label_3"));
label_3->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
horizontalLayout_2->addWidget(label_3);
horizontalLayout_2->setStretch(0, 1);
horizontalLayout_2->setStretch(1, 1);
horizontalLayout_2->setStretch(2, 1);
horizontalLayout_2->setStretch(3, 1);
horizontalLayout_2->setStretch(4, 1);
verticalLayout->addWidget(widget_2);
retranslateUi(Form);
QMetaObject::connectSlotsByName(Form);
} // setupUi
void retranslateUi(QWidget *Form)
{
Form->setWindowTitle(QApplication::translate("Form", "Form", 0, QApplication::UnicodeUTF8));
label->setText(QApplication::translate("Form", "0", 0, QApplication::UnicodeUTF8));
label_4->setText(QApplication::translate("Form", "25", 0, QApplication::UnicodeUTF8));
label_2->setText(QApplication::translate("Form", "50", 0, QApplication::UnicodeUTF8));
label_5->setText(QString());
label_3->setText(QApplication::translate("Form", "100", 0, QApplication::UnicodeUTF8));
} // retranslateUi
};
namespace Ui {
class Form: public Ui_Form {};
} // namespace Ui
QT_END_NAMESPACE
#endif // DESIGNERLS7532_H