QSlider mit Beschriftung?



  • Ich bin auf der Suche nach einem QSlider mit Beschriftung.

    Ich möchte damit eine Tonspur navigieren. Gefunden habe ich QwtSlider die schon mal
    eine Beschriftung mit Zahlen bereitstellen. Fast was ich brauche ... ich
    könnte damit 0-100% Slider bauen.

    Bisher nehme ich normalen QSlider , setze minimum auf 0 und maximum auf Tonspurlänge[ms].
    Gibt es ne Möglichkeit das Label immer zentriert unter dem Sliderknob zu haben
    oder halt ticks zu beschriften?

    // labeledtimeslider.h
    #ifndef LABELEDTIMESLIDER_H
    #define LABELEDTIMESLIDER_H
    
    #include <QtCore/QTime>
    
    #include <QtGui/QHBoxLayout>
    #include <QtGui/QLabel>
    #include <QtGui/QSlider>
    #include <QtGui/QWidget>
    
    // helperclass for label
    class TimeLabel : public QLabel
    {
        Q_OBJECT
    
    public:
        TimeLabel(QWidget * parent = 0, Qt::WindowFlags f = 0) :
                QLabel (parent, f) { setText(0); }
    
        virtual ~TimeLabel() {} ;
    
    public slots:
        void setText(int ms);
    };
    
    // widget for labeled slider
    class LabeledTimeSlider : public QWidget
    {
        Q_OBJECT
    public:
        LabeledTimeSlider(QTime length = QTime(23,59,59,999), QWidget * parent = 0);
    
        // not really needed, should be deleted by parenting-relationship
        virtual ~LabeledTimeSlider() { delete l; delete s; delete lay; } ;
    
    private:
        QHBoxLayout * lay;
        TimeLabel * l;
        QSlider   * s;
    };
    #endif // LABELEDTIMESLIDER_H
    
    // labeledtimeslider.cpp
    #include <QtCore/QTime>
    
    #include "labeledtimeslider.h"
    
    void TimeLabel::setText(int ms)
    {
        int hh = ms / (60*60*1000);     ms -= hh * (60*60*1000);
        int mm = ms / (60*1000);        ms -= mm * (60*1000);
        int ss = ms / (1000);           ms -= ss * 1000;
        int zz = ms;
    
        QTime tmp = QTime(hh,mm,ss,zz);
        if (tmp.isValid())
            QLabel::setText(tmp.toString("hh:mm:ss (zzz)"));
        else QLabel::setText("--:--:-- (---)");
    }
    
    LabeledTimeSlider::LabeledTimeSlider(QTime length, QWidget * parent) :
            QWidget(parent)
    {
        lay = new QHBoxLayout(this);
    
        s = new QSlider(Qt::Horizontal);
        int msec = length.hour()*60*60*1000 + length.minute()*60*1000 + length.second()*1000 + length.msec();
        s->setRange(0,msec);
    
        lay->addWidget(s);
    
        l = new TimeLabel();
        lay->addWidget(l);
    
        setLayout(lay);
        setMinimumSize(500,50);
        show();
    
        connect(s,SIGNAL(sliderMoved(int)),l,SLOT(setText(int)));
        connect(s,SIGNAL(valueChanged(int)),l,SLOT(setText(int)));
    }
    
    // main.cpp
    #include <QtGui/QApplication>
    #include <QtGui/QWidget>
    
    #include "labeledtimeslider.h"
    
    int main(int argv, char *args[])
    {
        QApplication app(argv, args);
    
        QWidget *g = new LabeledTimeSlider(QTime(0,15,24,289));
    
        g->show();
        return app.exec();
    }
    


  • passt doch bisher soweit. Ein l->setAlignment(Qt::AlignCenter); fehlt noch fürs zentrieren.



  • zwutz schrieb:

    passt doch bisher soweit. Ein l->setAlignment(Qt::AlignCenter); fehlt noch fürs zentrieren.

    Hab ich probiert, warscheinlich habe ich mich undeutlich ausgedrückt ...

    ich dachte daran das Label immer zentriert unter der derzeitigen Knopf-position des Sliders zu haben - ich vermute mal das klappt nur mit viel rumgepfusche im Inneren der Paint Methode eines abgeleiteten QSliders?


Anmelden zum Antworten