#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 的拷贝构造函数等都是私有的,只能以指针的形式保存到容器中,因而指针更为方便。
* 容器之类一般都是使用栈。不过这一点并不是绝对的,还是具体情况具体分析最好。*/
qt(3) layout QSlider QSpinBox
猜你喜欢
转载自blog.csdn.net/sinat_39028599/article/details/80677077
今日推荐
周排行