C++/Qt/QSlider

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Add slider to window

<source lang="cpp">

  1. include <QApplication>
  2. include <QHBoxLayout>
  3. include <QSlider>
  4. include <QSpinBox>

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   QWidget *window = new QWidget;
   window->setWindowTitle("Enter Your Age");
   QSpinBox *spinBox = new QSpinBox;
   QSlider *slider = new QSlider(Qt::Horizontal);
   spinBox->setRange(0, 130);
   slider->setRange(0, 130);
   QObject::connect(spinBox, SIGNAL(valueChanged(int)),slider, SLOT(setValue(int)));
   QObject::connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));
   spinBox->setValue(35);
   QHBoxLayout *layout = new QHBoxLayout;
   layout->addWidget(spinBox);
   layout->addWidget(slider);
   window->setLayout(layout);
   window->show();
   return app.exec();

}


 </source>


Add value change signal for slider

<source lang="cpp">

  1. include <QApplication>
  2. include <QHBoxLayout>
  3. include <QSlider>
  4. include <QSpinBox>

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   QWidget *window = new QWidget;
   window->setWindowTitle("Enter Your Age");
   QSpinBox *spinBox = new QSpinBox;
   QSlider *slider = new QSlider(Qt::Horizontal);
   spinBox->setRange(0, 130);
   slider->setRange(0, 130);
   QObject::connect(spinBox, SIGNAL(valueChanged(int)),slider, SLOT(setValue(int)));
   QObject::connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));
   spinBox->setValue(35);
   QHBoxLayout *layout = new QHBoxLayout;
   layout->addWidget(spinBox);
   layout->addWidget(slider);
   window->setLayout(layout);
   window->show();
   return app.exec();

}


 </source>


Set range for slider

<source lang="cpp">

  1. include <QApplication>
  2. include <QHBoxLayout>
  3. include <QSlider>
  4. include <QSpinBox>

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   QWidget *window = new QWidget;
   window->setWindowTitle("Enter Your Age");
   QSpinBox *spinBox = new QSpinBox;
   QSlider *slider = new QSlider(Qt::Horizontal);
   spinBox->setRange(0, 130);
   slider->setRange(0, 130);
   QObject::connect(spinBox, SIGNAL(valueChanged(int)),slider, SLOT(setValue(int)));
   QObject::connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int)));
   spinBox->setValue(35);
   QHBoxLayout *layout = new QHBoxLayout;
   layout->addWidget(spinBox);
   layout->addWidget(slider);
   window->setLayout(layout);
   window->show();
   return app.exec();

}


 </source>


Slider group

<source lang="cpp"> /****************************************************************************

    • Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
    • All rights reserved.
    • Contact: Nokia Corporation (qt-info@nokia.com)
    • This file is part of the examples of the Qt Toolkit.
    • $QT_BEGIN_LICENSE:LGPL$
    • Commercial Usage
    • Licensees holding valid Qt Commercial licenses may use this file in
    • accordance with the Qt Commercial License Agreement provided with the
    • Software or, alternatively, in accordance with the terms contained in
    • a written agreement between you and Nokia.
    • GNU Lesser General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU Lesser
    • General Public License version 2.1 as published by the Free Software
    • Foundation and appearing in the file LICENSE.LGPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU Lesser General Public License version 2.1 requirements
    • will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
    • In addition, as a special exception, Nokia gives you certain additional
    • rights. These rights are described in the Nokia Qt LGPL Exception
    • version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
    • GNU General Public License Usage
    • Alternatively, this file may be used under the terms of the GNU
    • General Public License version 3.0 as published by the Free Software
    • Foundation and appearing in the file LICENSE.GPL included in the
    • packaging of this file. Please review the following information to
    • ensure the GNU General Public License version 3.0 requirements will be
    • met: http://www.gnu.org/copyleft/gpl.html.
    • If you have questions regarding the use of this file, please contact
    • Nokia at qt-info@nokia.com.
    • $QT_END_LICENSE$
                                                                                                                                                        • /
  1. ifndef SLIDERSGROUP_H
  2. define SLIDERSGROUP_H
  3. include <QGroupBox>

QT_BEGIN_NAMESPACE class QDial; class QScrollBar; class QSlider; QT_END_NAMESPACE

class SlidersGroup : public QGroupBox {

   Q_OBJECT

public:

   SlidersGroup(Qt::Orientation orientation, const QString &title,
                QWidget *parent = 0);

signals:

   void valueChanged(int value);

public slots:

   void setValue(int value);
   void setMinimum(int value);
   void setMaximum(int value);
   void invertAppearance(bool invert);
   void invertKeyBindings(bool invert);

private:

   QSlider *slider;
   QScrollBar *scrollBar;
   QDial *dial;

};

  1. endif


  1. include <QtGui>
  2. include "slidersgroup.h"

SlidersGroup::SlidersGroup(Qt::Orientation orientation, const QString &title,

                          QWidget *parent)
   : QGroupBox(title, parent)

{

   slider = new QSlider(orientation);
   slider->setFocusPolicy(Qt::StrongFocus);
   slider->setTickPosition(QSlider::TicksBothSides);
   slider->setTickInterval(10);
   slider->setSingleStep(1);
   scrollBar = new QScrollBar(orientation);
   scrollBar->setFocusPolicy(Qt::StrongFocus);
   dial = new QDial;
   dial->setFocusPolicy(Qt::StrongFocus);
   connect(slider, SIGNAL(valueChanged(int)), scrollBar, SLOT(setValue(int)));
   connect(scrollBar, SIGNAL(valueChanged(int)), dial, SLOT(setValue(int)));
   connect(dial, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));

   connect(dial, SIGNAL(valueChanged(int)), this, SIGNAL(valueChanged(int)));


   QBoxLayout::Direction direction;

   if (orientation == Qt::Horizontal)
       direction = QBoxLayout::TopToBottom;
   else
       direction = QBoxLayout::LeftToRight;
   QBoxLayout *slidersLayout = new QBoxLayout(direction);
   slidersLayout->addWidget(slider);
   slidersLayout->addWidget(scrollBar);
   slidersLayout->addWidget(dial);
   setLayout(slidersLayout);

}

void SlidersGroup::setValue(int value)

{

   slider->setValue(value);

}

void SlidersGroup::setMinimum(int value)

{

   slider->setMinimum(value);
   scrollBar->setMinimum(value);
   dial->setMinimum(value);

}

void SlidersGroup::setMaximum(int value)

{

   slider->setMaximum(value);
   scrollBar->setMaximum(value);
   dial->setMaximum(value);

}

void SlidersGroup::invertAppearance(bool invert)

{

   slider->setInvertedAppearance(invert);
   scrollBar->setInvertedAppearance(invert);
   dial->setInvertedAppearance(invert);

}

void SlidersGroup::invertKeyBindings(bool invert)

{

   slider->setInvertedControls(invert);
   scrollBar->setInvertedControls(invert);
   dial->setInvertedControls(invert);

}


  1. ifndef WINDOW_H
  2. define WINDOW_H
  3. include <QWidget>

QT_BEGIN_NAMESPACE class QCheckBox; class QComboBox; class QGroupBox; class QLabel; class QSpinBox; class QStackedWidget; QT_END_NAMESPACE class SlidersGroup;

class Window : public QWidget {

   Q_OBJECT

public:

   Window();

private:

   void createControls(const QString &title);
   SlidersGroup *horizontalSliders;
   SlidersGroup *verticalSliders;
   QStackedWidget *stackedWidget;
   QGroupBox *controlsGroup;
   QLabel *minimumLabel;
   QLabel *maximumLabel;
   QLabel *valueLabel;
   QCheckBox *invertedAppearance;
   QCheckBox *invertedKeyBindings;
   QSpinBox *minimumSpinBox;
   QSpinBox *maximumSpinBox;
   QSpinBox *valueSpinBox;
   QComboBox *orientationCombo;

};

  1. endif


  1. include <QtGui>
  2. include "slidersgroup.h"
  3. include "window.h"

Window::Window() {

   horizontalSliders = new SlidersGroup(Qt::Horizontal, tr("Horizontal"));
   verticalSliders = new SlidersGroup(Qt::Vertical, tr("Vertical"));
   stackedWidget = new QStackedWidget;
   stackedWidget->addWidget(horizontalSliders);
   stackedWidget->addWidget(verticalSliders);
   createControls(tr("Controls"));
   connect(horizontalSliders, SIGNAL(valueChanged(int)),

           verticalSliders, SLOT(setValue(int)));
   connect(verticalSliders, SIGNAL(valueChanged(int)),
           valueSpinBox, SLOT(setValue(int)));
   connect(valueSpinBox, SIGNAL(valueChanged(int)),
           horizontalSliders, SLOT(setValue(int)));
   QHBoxLayout *layout = new QHBoxLayout;
   layout->addWidget(controlsGroup);
   layout->addWidget(stackedWidget);
   setLayout(layout);
   minimumSpinBox->setValue(0);
   maximumSpinBox->setValue(20);
   valueSpinBox->setValue(5);
   setWindowTitle(tr("Sliders"));

}

void Window::createControls(const QString &title)

{

   controlsGroup = new QGroupBox(title);
   minimumLabel = new QLabel(tr("Minimum value:"));
   maximumLabel = new QLabel(tr("Maximum value:"));
   valueLabel = new QLabel(tr("Current value:"));
   invertedAppearance = new QCheckBox(tr("Inverted appearance"));
   invertedKeyBindings = new QCheckBox(tr("Inverted key bindings"));

   minimumSpinBox = new QSpinBox;

   minimumSpinBox->setRange(-100, 100);
   minimumSpinBox->setSingleStep(1);
   maximumSpinBox = new QSpinBox;
   maximumSpinBox->setRange(-100, 100);
   maximumSpinBox->setSingleStep(1);
   valueSpinBox = new QSpinBox;
   valueSpinBox->setRange(-100, 100);
   valueSpinBox->setSingleStep(1);
   orientationCombo = new QComboBox;
   orientationCombo->addItem(tr("Horizontal slider-like widgets"));
   orientationCombo->addItem(tr("Vertical slider-like widgets"));

   connect(orientationCombo, SIGNAL(activated(int)),

           stackedWidget, SLOT(setCurrentIndex(int)));
   connect(minimumSpinBox, SIGNAL(valueChanged(int)),
           horizontalSliders, SLOT(setMinimum(int)));
   connect(minimumSpinBox, SIGNAL(valueChanged(int)),
           verticalSliders, SLOT(setMinimum(int)));
   connect(maximumSpinBox, SIGNAL(valueChanged(int)),
           horizontalSliders, SLOT(setMaximum(int)));
   connect(maximumSpinBox, SIGNAL(valueChanged(int)),
           verticalSliders, SLOT(setMaximum(int)));
   connect(invertedAppearance, SIGNAL(toggled(bool)),
           horizontalSliders, SLOT(invertAppearance(bool)));
   connect(invertedAppearance, SIGNAL(toggled(bool)),
           verticalSliders, SLOT(invertAppearance(bool)));
   connect(invertedKeyBindings, SIGNAL(toggled(bool)),
           horizontalSliders, SLOT(invertKeyBindings(bool)));
   connect(invertedKeyBindings, SIGNAL(toggled(bool)),
           verticalSliders, SLOT(invertKeyBindings(bool)));
   QGridLayout *controlsLayout = new QGridLayout;
   controlsLayout->addWidget(minimumLabel, 0, 0);
   controlsLayout->addWidget(maximumLabel, 1, 0);
   controlsLayout->addWidget(valueLabel, 2, 0);
   controlsLayout->addWidget(minimumSpinBox, 0, 1);
   controlsLayout->addWidget(maximumSpinBox, 1, 1);
   controlsLayout->addWidget(valueSpinBox, 2, 1);
   controlsLayout->addWidget(invertedAppearance, 0, 2);
   controlsLayout->addWidget(invertedKeyBindings, 1, 2);
   controlsLayout->addWidget(orientationCombo, 3, 0, 1, 3);
   controlsGroup->setLayout(controlsLayout);

}


  1. include <QApplication>
  2. include "window.h"

int main(int argc, char *argv[]) {

   QApplication app(argc, argv);
   Window window;
   window.show();
   return app.exec();

}


 </source>


Using QSlider to control custom component

<source lang="cpp">

Foundations of Qt Development\Chapter06\circlebar\circlebar.cpp /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*       and/or other materials provided with the distribution.
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. include <QPaintEvent>
  2. include <QWheelEvent>
  3. include <QPainter>
  4. include "circlebar.h"

CircleBar::CircleBar( int value, QWidget *parent ) : QWidget( parent ) {

 m_value = value;
 
 QSizePolicy policy( QSizePolicy::Preferred, QSizePolicy::Preferred );
 policy.setHeightForWidth( true );
 setSizePolicy( policy );

} int CircleBar::heightForWidth( int width ) const {

 return width;

} QSize CircleBar::sizeHint() const {

 return QSize( 100, 100 );

} int CircleBar::value() const {

 return m_value;

} void CircleBar::setValue( int value ) {

 if( value < 0 )
   value = 0;
 
 if( value > 100 )
   value = 100;
   
 if( m_value == value )
   return;
   
 m_value = value;
 update();
 emit valueChanged( m_value );

} void CircleBar::paintEvent( QPaintEvent *event ) {

 int radius = width()/2;
 double factor = m_value/100.0;
 
 QPainter p( this );
 p.setPen( Qt::black );
 p.drawEllipse( 0, 0, width()-1, width()-1 );
 p.setBrush( Qt::black );
 p.drawEllipse( int(radius*(1.0-factor)), int(radius*(1.0-factor)), int((width()-1)*factor)+1, int((width()-1)*factor)+1 );

} void CircleBar::wheelEvent( QWheelEvent *event ) {

 event->accept();
 setValue( value() + event->delta()/20 );

}

Foundations of Qt Development\Chapter06\circlebar\circlebar.h /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*       and/or other materials provided with the distribution.
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. ifndef CIRCLEBAR_H
  2. define CIRCLEBAR_H
  3. include <QWidget>

class CircleBar : public QWidget {

 Q_OBJECT

public:

 CircleBar( int value = 0, QWidget *parent = 0 );
 
 int value() const;
 
 int heightForWidth( int ) const;
 QSize sizeHint() const;  

public slots:

 void setValue( int );
 

signals:

 void valueChanged( int );
 

protected:

 void paintEvent( QPaintEvent* );
 void wheelEvent( QWheelEvent* );
 

private:

 int m_value;

};

  1. endif // CIRCLEBAR_H

Foundations of Qt Development\Chapter06\circlebar\main.cpp /*

* Copyright (c) 2006-2007, Johan Thelin
* 
* All rights reserved.
* 
* Redistribution and use in source and binary forms, with or without modification, 
* are permitted provided that the following conditions are met:
* 
*     * Redistributions of source code must retain the above copyright notice, 
*       this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above copyright notice,  
*       this list of conditions and the following disclaimer in the documentation 
*     * Neither the name of APress nor the names of its contributors 
*       may be used to endorse or promote products derived from this software 
*       without specific prior written permission.
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
  1. include <QApplication>
  2. include <QSlider>
  3. include <QVBoxLayout>
  4. include "circlebar.h"

int main( int argc, char **argv ) {

 QApplication app( argc, argv );
 
 QWidget base;
 QVBoxLayout layout( &base );
 
 CircleBar bar;
 QSlider slider( Qt::Horizontal );
 
 layout.addWidget( &bar );
 layout.addWidget( &slider );
 
 QObject::connect( &slider, SIGNAL(valueChanged(int)), &bar, SLOT(setValue(int)) );
 QObject::connect( &bar, SIGNAL(valueChanged(int)), &slider, SLOT(setValue(int)) );
 
 base.show();
 
 return app.exec();

}


 </source>