难以在QGridLayout中操作QSlider

时间:2011-06-01 16:35:05

标签: qt qt4 qslider

我正在尝试创建一个动态QSlider,它接受一个整数值的QVector,并将它们映射到QSlider下面相对于它们所代表的位置。

这是我现在拥有的截图: My Slider http://dev.kyleswebspace.com/images/QInteractiveSlider.jpg

正如您所看到的,刻度线与它们的值不对齐。这是其中一个问题。

我正在努力解决的主要问题是,无论我将PADDING值更改为(请参阅qinteractiveslider.h),我的窗口小部件中的QSlider与值网格的大小保持相同。

  1. 为什么不是我的QGridLayout的论点 提供正确的数量 填充?
  2. 如何强制执行这些边距 QSlider?
  3. 有更好的定位方式吗? 这些标签?我愿意接受 建议。
  4. 以下是代码:

    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();
    }
    

3 个答案:

答案 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的组合,这样你就可以正确地放置东西而不会有太多的边缘麻烦。

以下代码生成的屏幕截图如下:

enter image description here

通过在标签上放置最大宽度,可以使它更漂亮。这样你就可以避免必须将左对齐设置为右对齐。

#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