qt(3) layout QSlider QSpinBox

#include "mainwindow.h"
#include <QApplication>
#include<QSlider>
#include<QSpinBox>
#include<QHBoxLayout>
/*
 * int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}
*/
int main(int argc,char *argv[])
{
    QApplication app(argc,argv);

    QWidget window;
    window.setWindowTitle("Enter your age");

    QSpinBox *spinBox = new QSpinBox(&window);
    /*
     * QSpinBox就是只能输入数字的输入框,并且带有上下箭头的步进按钮。
#include <QApplication>
#include <QSpinBox>

int main(int argc,char **argv)
{
        QApplication app(argc,argv);
        QSpinBox *spinbox=new QSpinBox;
        spinbox->setSingleStep(2);
        spinbox->setRange(0,100);       //设置变化范围
        spinbox->setSuffix("km");       //设置输出显示后缀
        spinbox->setPrefix("$");        //设置输出显示前缀
        spinbox->resize(200,40);        //设置大小
        spinbox->setValue(50);          //设置初始值
        //spinbox->setMaximum(100);     //设置最大值
        //spinbox->setMinimun(0);       //设置最小值
        spinbox->show();
        return app.exec();
}*/

    QSlider *slider = new QSlider(Qt::Horizontal,&window);
    //QSlider则是带有滑块的滑竿
    spinBox->setRange(0,130);
    slider->setRange(0,130);

    QObject::connect(slider,&QSlider::valueChanged,spinBox,&QSpinBox::setValue);
    void (QSpinBox::*spinBoxSignal)(int) = &QSpinBox::valueChanged;
    /*
     * QSpinBox的确有两个信号:void valueChanged(int)            void valueChanged(const QString &)
当我们使用&QSpinBox::valueChanged取函数指针时,编译器不知道应该取哪一个函数(
经过 moc 预处理后,signal 也是一个普通的函数。)的地址,因此报错,所以显式指定一个函数:创建一个函数指针,这个函数指针参数指定为 int
然后我们将这个函数指针作为 signal,与 QSlider 的函数连接
*/
   QObject::connect(spinBox,spinBoxSignal,slider,&QSlider::setValue);
    spinBox->setValue(35);


    int nMin = 0;
    int nMax = 200;
    int nSingleStep = 10;

    // 微调框
    QSpinBox *pSpinBox = new QSpinBox(&window);
    pSpinBox->setMinimum(nMin);  // 最小值
    pSpinBox->setMaximum(nMax);  // 最大值
    pSpinBox->setSingleStep(nSingleStep);  // 步长

    // 滑动条
    QSlider *pSlider = new QSlider(&window);
    pSlider->setOrientation(Qt::Horizontal);  // 水平方向
    pSlider->setMinimum(nMin);  // 最小值
    pSlider->setMaximum(nMax);  // 最大值
    pSlider->setSingleStep(nSingleStep);  // 步长
    pSlider->setTickInterval(40);  // 设置刻度间隔
    pSlider->setTickPosition(QSlider::TicksAbove);  //刻度在上方
    /*
     * QSlider::NoTicks         0       不绘制任何刻度线
       QSlider::TicksBothSides  3       在滑块的两侧绘制刻度线
       QSlider::TicksAbove      1       在(水平)滑块上方绘制刻度线
       QSlider::TicksBelow      2       在(水平)滑块下方绘制刻度线
       QSlider::TicksLeft   TicksAbove  在(垂直)滑块左侧绘制刻度线
       QSlider::TicksRight  TicksBelow  在(垂直)滑块右侧绘制刻度线*/

    // 连接信号槽(相互改变)
    QObject::connect(pSpinBox, SIGNAL(valueChanged(int)), pSlider, SLOT(setValue(int)));
    QObject::connect(pSlider, SIGNAL(valueChanged(int)), pSpinBox, SLOT(setValue(int)));
    /*
     * valueChanged()       当滑块的值发生了改变,发射此信号。tracking()确定在用户交互时,是否发出此信号。
       sliderPressed()      当用户按下滑块,发射此信号。
       sliderMoved()        当用户拖动滑块,发射此信号。
       sliderReleased()     当用户释放滑块,发射此信号。*/

    pSpinBox->setValue(10);
    QHBoxLayout *layout = new QHBoxLayout;
    /*
     * 不是传入new QHBoxLayout(&window)呢?而是使用空参数的折构方法
     * 因为调用 setLayout() 函数的时候,如果这个 layout 不属于调用 setLayout() 函数的组件,
     * 则会自动设置为该组件。因此,你可以在 new 的时候就添加 parent 指针参数,
     * 也可以通过 setLayout() 设置。需要注意的是,如果构造函数添加了 parent 指针,
     * 后来又调用了 setLayout() 函数,如果二者不相同,
     * 则 setLayout() 函数设置的 parent 指针会覆盖构造函数传入的。*/
    /*
     *
    QHBoxLayout:按照水平方向从左到右布局;
    QVBoxLayout:按照竖直方向从上到下布局;
    QGridLayout:在一个网格中进行布局,类似于 HTML 的 table;
    QFormLayout:按照表格布局,每一行前面是一段文本,文本后面跟随一个组件(通常是输入框),类似 HTML 的 form;
    QStackedLayout:层叠的布局,允许我们将几个组件按照 Z 轴方向堆叠,可以形成向导那种一页一页的效果。
*/
    layout->addWidget(spinBox);
    layout->addWidget(slider);
    layout->addWidget(pSpinBox);
    layout->addWidget(pSlider);
    window.setLayout(layout);

    window.show();

    return app.exec();
}
/*
 * 虽然里面的 QSpinBox 是在堆上分配的,但是最外层的 window 却是在栈上。
 * 注意 QSpinBox 的 parent 参数都设置为 window,也就是说,当 window 析构时,
 * 其子元素也会被析构,因此不存在什么问题。*/

/*
 * QMainWindow 的确是继承自 QWidget,但是它同时添加了自己的 layout,正因为有 layout 的存在,
 * 所以你需要使用 setCentralWidget() 函数把一个 QWidget 设置为中心的组件,
 * 而不是把一个个的子组件用自己的 layout 添加进去(因为 QMainWindow 已经有了默认的 layout,
 * 你自己的 layout 才会不起作用)。*/

/*
 * 所有 QObject 的子类用指针,因为 Qt 可以利用 parent 指针进行半自动化管理,因此建议使用指针。
 * 因为由于QObject 的拷贝构造函数等都是私有的,只能以指针的形式保存到容器中,因而指针更为方便。
 * 容器之类一般都是使用栈。不过这一点并不是绝对的,还是具体情况具体分析最好。*/

猜你喜欢

转载自blog.csdn.net/sinat_39028599/article/details/80677077
今日推荐