C++/Qt/QSlider
Содержание
Add slider to window
<source lang="cpp">
- include <QApplication>
- include <QHBoxLayout>
- include <QSlider>
- 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">
- include <QApplication>
- include <QHBoxLayout>
- include <QSlider>
- 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">
- include <QApplication>
- include <QHBoxLayout>
- include <QSlider>
- 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$
-
- /
- ifndef SLIDERSGROUP_H
- define SLIDERSGROUP_H
- 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;
};
- endif
- include <QtGui>
- 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);
}
- ifndef WINDOW_H
- define WINDOW_H
- 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;
};
- endif
- include <QtGui>
- include "slidersgroup.h"
- 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);
}
- include <QApplication>
- 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. * */
- include <QPaintEvent>
- include <QWheelEvent>
- include <QPainter>
- 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. * */
- ifndef CIRCLEBAR_H
- define CIRCLEBAR_H
- 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;
};
- 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. * */
- include <QApplication>
- include <QSlider>
- include <QVBoxLayout>
- 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>