zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Qt之QSpinBox和QDoubleSpinBox

Qt
2023-09-11 14:19:13 时间

QSpinBox旨在处理整数和离散值(例如:月份名称),QDoubleSpinBox则用于处理浮点值。他们之间的区别就是处理数据的类型不同,其他功能都基本相同。

QDoubleSpinBox的默认的精度是2位小数,但可以通过setDecimals()来改变。

下面主要以QSpinBox为例,来讲解常用的功能。最后部分,会单独分享QDoubleSpinBox的精度设置。


QSpinBox允许用户选择一个值,通过单击向上/向下按钮或按下键盘的上/下箭头来增加/减少当前显示的值,用户也可以输入值。微调框支持整数值,但可以被扩展为不同的字符串,使用validate()、textFromValue()和valueFromText()。

当QSpinBox的值发生改变时,会发射两个valueChanged()信号,其中一个提供int类型,另一个则是QString类型,该QString提供了prefix()和suffix()。当前值可以用value()来读取,setValue()来设置。

单击向上/向下按钮或按下键盘的上/下箭头时,将以singleStep()为步长增加/减少当前值。如果想改变这种行为,可以重载虚函数stepBy()。最小值、最大值和步长可以使用其中的一个构造函数来设置,以后可以用setMinimum()、setMaximum()和setSingleStep()来修改。

大多数微调框是定向的,但也可以设置为循环的。例如:如果取值范围是0 - 99,当前值是99,如果wrapping()被设置为true,点击“向上”按钮值会变为0。如果你想要一个循环微调框,可以使用setWrapping()函数。

显示的值可以和任意的字符串进行附加,适用setPrefix()和setSuffix()分别可以设置前缀和后缀,例如:货币或计量单位。微调框中的文本可以用text()(包括任何前缀和后缀)或者通过cleanText()(没有前缀()、没有后缀()、无前导或结尾空白)来获取。

除了数值的范围,通常需要使用setSpecialValueText()给用户一个特殊(默认)的选择。


设置步长为10以后,当值发生改变时,就会在当前值的基础上±10(相当于一个等差数列,公差为10)。当我们开启循环后,当前值达到最大或者最小时,就会循环(类似于听歌的列表循环)。


connect(pSpinBox, static_cast void(QSpinBox::*)(int) ( QSpinBox::valueChanged), [=](int value) qDebug() "Value : " value; qDebug() "Text : " pSpinBox- text(); connect(pSpinBox, static_cast void(QSpinBox::*)(const QString ) ( QSpinBox::valueChanged), [=](const QString text) qDebug() "Text Value : " text; qDebug() "Clean Text : " pSpinBox- cleanText(); };

这里使用了Qt5的信号与槽的语法(后面详细讲解),由于valueChanged()是一个重载信号,所以需要进行参数类别区分。

输出如下:


Text Value : "$ 160 %"
Clean Text : "160"
Value : 160
Text : "$ 160 %"


如果设置了specialValueText,只要当前值等于微调框的最小值时,将显示该文本,而不是一个数值。典型的用途是表明此选择具有特殊(默认)的意思。

例如,如果你的微调框允许用户可以选择一个比例系数(或缩放级别),用于显示图像,并且应用程序能够自动选择一个,将使图像完全符合显示窗口,可以像这样设置微调框:


QSpinBox *zoomSpinBox = new QSpinBox(this);

zoomSpinBox- setRange(0, 1000); // 范围

zoomSpinBox- setSingleStep(10); // 步长

zoomSpinBox- setSuffix("%"); // 前缀

zoomSpinBox- setSpecialValueText(tr("Automatic")); // 特殊文本值

zoomSpinBox- setValue(100); // 当前值

一旦当前值变为最小值时,显示的就是Automatic。


如果使用prefix()、suffix()和specialValueText()没有提供足够的控制,可以子类化QSpinBox,重写valueFromText()和textFromValue()。

例如,自定义一个微调框,允许用户输入图标大小(例如:”32 x 32”):


// 将输入的文本解读为适当的值 virtual int valueFromText(const QString text) const Q_DECL_OVERRIDE QRegExp regExp(tr("(\\d+)(\\s*[xx]\\s*\\d+)?")); if (regExp.exactMatch(text)) { return regExp.cap(1).toInt(); } else { return 0; // 根据输入的值返回文本 virtual QString textFromValue(int value) const Q_DECL_OVERRIDE return tr("%1 x %1").arg(value); };

下面,我们看下精度的用法,其实比较简单,一般主要使用setDecimals()设置精度,然后利用setSingleStep()来设置步长即可。


QDoubleSpinBox *pSpinBox = new QDoubleSpinBox(this);

pSpinBox- setRange(0, 20); // 范围

pSpinBox- setDecimals(3); // 精度

pSpinBox- setSingleStep(0.005); // 步长

connect(pSpinBox, static_cast void(QDoubleSpinBox::*)(const QString ) ( QDoubleSpinBox::valueChanged),[=](const QString text)

 qDebug() text;

});

常用的基本就这些,如果需要更多其他的特性,请参考QAbstractSpinBox。


该类提供了一个到 FTP 的直接接口,允许对请求有更多的控制。但是,对于新的应用程序,建议使用 QNetworkAccessManager 和 QNetworkReply,因为这些类拥有一个更简单、还更强大的 API。
QTimeLine 类提供了用于控制动画的时间轴,通常用于通过定期调用一个槽函数来动画一个 GUI 控件。 相信了解动画的人对帧应该不陌生,可以把一个动画想象成由很多张静态画面组成,而每一个画面就是一帧图像。每隔一定时间间隔就显示一帧图像,当该间隔较短时,人眼就感觉不出来了,觉得看到的是连续的影像。
Qt 的主事件循环(QCoreApplication::exec())从事件队列中获取本地窗口系统事件,将它们转化为 QEvents,然后将转换后的事件发送给 QObjects。 一般来说,事件来自底层窗口系统(spontaneous() 返回 true),但也可以使用 QCoreApplication:
QDateTimeEdit允许用户编辑日期,通过使用键盘或箭头键来增加和减少日期和时间值。箭头键可以在QDateTimeEdit内进行部分移动,日期和时间的格式按照setDisplayFormat()设置的显示。
QHostAddress通常与QTcpSocket、QTcpServer、QUdpSocket一起使用,来连接到主机或建立一个服务器。 可以通过setAddress()来设置一个主机地址,使用toIPv4Address()、toIPv6Address
每个网络接口可以包含零个或多个IP地址,进而可以关联到一个子网掩码和/或一个广播地址(取决于操作系统的支持)。 这个类代表一个这样的组。
现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区域,长时间运行的应用程序可以显示图标和短消息。
大小策略会影响布局引擎处理部件的方式,部件加入布局以后,会返回一个QSizePolicy,描述了其水平和垂直方向的大小策略。可以通过QWidget::sizePolicy属性为特定部件设置大小策略。
调用addPath()函数可以监控一个特定的文件或目录。如果需要监控多个路径,可以使用addPaths()。通过使用removePath()和removePaths()函数来移除现有路径。