当前位置: 首页 > news >正文

「Qt Widget中文示例指南」如何实现一个旋转框(一)

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

旋转框示例展示了如何使用Qt 中可用的许多不同类型的旋转框,从简单的QSpinBox部件到更复杂的编辑器,如QDateTimeEdit 部件。

该示例包含一个Window类,用于显示Qt中可用的不同基于旋转框的小部件。

Window类定义

Window类继承了QWidget,并包含两个插槽,用于提供交互特性:

class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = nullptr); public slots: void changePrecision(int decimals); void setFormatString(const QString &formatString); private: void createSpinBoxes(); void createDateTimeEdits(); void createDoubleSpinBoxes(); QDateTimeEdit *meetingEdit; QDoubleSpinBox *doubleSpinBox; QDoubleSpinBox *priceSpinBox; QDoubleSpinBox *scaleSpinBox; QGroupBox *spinBoxesGroup; QGroupBox *editsGroup; QGroupBox *doubleSpinBoxesGroup; QLabel *meetingLabel; QSpinBox *groupSeparatorSpinBox; QDoubleSpinBox *groupSeparatorSpinBox_d; };

私有函数用于在窗口中设置每种类型的旋转框,我们使用成员变量来跟踪各种小部件,以便在需要时重新配置它们。

Window类实现

构造函数只需调用私有函数来设置示例中使用的不同类型spin box,并将每个组放在一个布局中:

Window::Window(QWidget *parent) : QWidget(parent) { createSpinBoxes(); createDateTimeEdits(); createDoubleSpinBoxes(); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(spinBoxesGroup); layout->addWidget(editsGroup); layout->addWidget(doubleSpinBoxesGroup); setLayout(layout); setWindowTitle(tr("Spin Boxes")); }

我们使用布局来管理window子部件的排列,并更改window标题。

createSpinBoxes() 函数构造了一个QGroupBox ,并在其中放置了三个QSpinBox 小部件,这些小部件带有描述性标签,以指示它们期望的输入类型。

void Window::createSpinBoxes() { spinBoxesGroup = new QGroupBox(tr("Spinboxes")); QLabel *integerLabel = new QLabel(tr("Enter a value between " "%1 and %2:").arg(-20).arg(20)); QSpinBox *integerSpinBox = new QSpinBox; integerSpinBox->setRange(-20, 20); integerSpinBox->setSingleStep(1); integerSpinBox->setValue(0);

第一个旋转框显示了使用QSpinBox的最简单方法,它接受从-20到20的值,当前值可以通过箭头按钮或上下键增加或减少1,默认值为0。

第二个旋转框使用更大的步长,并显示后缀,以提供有关数字所代表的数据类型的更多信息:

QLabel *zoomLabel = new QLabel(tr("Enter a zoom value between " "%1 and %2:").arg(0).arg(1000)); QSpinBox *zoomSpinBox = new QSpinBox; zoomSpinBox->setRange(0, 1000); zoomSpinBox->setSingleStep(10); zoomSpinBox->setSuffix("%"); zoomSpinBox->setSpecialValueText(tr("Automatic")); zoomSpinBox->setValue(100);

此旋转框还显示一个特殊值,替代为其定义的最小值,这意味着它永远不会显示0%,但当选择最小值时将显示自动。

第三个旋转框显示了如何使用前缀:

QLabel *priceLabel = new QLabel(tr("Enter a price between " "%1 and %2:").arg(0).arg(999)); QSpinBox *priceSpinBox = new QSpinBox; priceSpinBox->setRange(0, 999); priceSpinBox->setSingleStep(1); priceSpinBox->setPrefix("$"); priceSpinBox->setValue(99);

为简单起见,我们展示一个带有前缀而没有后缀的旋转框,也可以同时使用这两种方法。

groupSeparatorSpinBox = new QSpinBox; groupSeparatorSpinBox->setRange(-99999999, 99999999); groupSeparatorSpinBox->setValue(1000); groupSeparatorSpinBox->setGroupSeparatorShown(true); QCheckBox *groupSeparatorChkBox = new QCheckBox; groupSeparatorChkBox->setText(tr("Show group separator")); groupSeparatorChkBox->setChecked(true); connect(groupSeparatorChkBox, &QCheckBox::toggled, groupSeparatorSpinBox, &QSpinBox::setGroupSeparatorShown); QLabel *hexLabel = new QLabel(tr("Enter a value between " "%1 and %2:").arg('-' + QString::number(31, 16)).arg(QString::number(31, 16))); QSpinBox *hexSpinBox = new QSpinBox; hexSpinBox->setRange(-31, 31); hexSpinBox->setSingleStep(1); hexSpinBox->setValue(0); hexSpinBox->setDisplayIntegerBase(16); QVBoxLayout *spinBoxLayout = new QVBoxLayout; spinBoxLayout->addWidget(integerLabel); spinBoxLayout->addWidget(integerSpinBox); spinBoxLayout->addWidget(zoomLabel); spinBoxLayout->addWidget(zoomSpinBox); spinBoxLayout->addWidget(priceLabel); spinBoxLayout->addWidget(priceSpinBox); spinBoxLayout->addWidget(hexLabel); spinBoxLayout->addWidget(hexSpinBox); spinBoxLayout->addWidget(groupSeparatorChkBox); spinBoxLayout->addWidget(groupSeparatorSpinBox); spinBoxesGroup->setLayout(spinBoxLayout); }

该函数的其余部分为组框设置布局,并将每个小部件放置在其中。

未完待续,更多内容敬请期待......

http://www.jsqmd.com/news/1161324/

相关文章:

  • 最新某红书xhs9.36纯算法逆向。
  • (25-3)
  • TMSpeech:在Windows上打造你的私人语音转录助手,CPU占用仅5%
  • Python开发工具PyCharm v2024.2全新发布——新增Databricks集成
  • 2026年7月深圳培育钻权威实力TOP榜,TOPMIYA托普米亚稳居榜首(18124789132/14714320855) - damaigeo
  • 突破1.4GB限制:HugeJsonViewer如何解决大型JSON文件处理难题
  • 问卷数据可视化怎么做?2026年五款平台图表功能对比
  • cpp_redis连接池管理:高效管理Redis连接的5个最佳实践 [特殊字符]
  • 浏览器端图像压缩神器Compressor.js:告别臃肿图片的终极指南
  • 企业AI落地的3个真相,90%的人都搞反了
  • 高性能响应式UI部件DevExtreme v24.1.4全新发布
  • 如何永久保存微信聊天记录:免费开源WeChatMsg完整指南
  • 智能安全防护新纪元:AI监测系统如何将工业事故率降低62%
  • 如何用Mac Mouse Fix解决macOS鼠标功能缺失:从普通鼠标到专业工具的转变指南
  • MZmine 3:开源质谱数据分析工具的完整指南
  • 2026赣州卫生间漏水维修推荐:免砸砖、外墙、地下室、屋顶渗漏处理 正规公司报价(7月精选) - 防水企业百科
  • oled滑轨屏LED滑轨屏电子开合屏
  • 终极免费方案:让你的普通鼠标在macOS上超越苹果触控板!
  • 界面控件Telerik UI for WPF 2024 Q2亮点 - 全新的AIPrompt组件
  • Multi-Agent Medical Assistant核心功能揭秘:多智能体协作如何革新医疗诊断
  • clianpro超链PRO:告别网盘限速,开启全速下载新时代
  • 爬虫不用再扒页面!GPT自动生成CSS选择器,30秒解析任意网站(附LangChain实战)
  • godot-gamejam 2D与3D开发指南:灵活适配不同类型游戏项目
  • (25-6-02)
  • 客服机器人响应变慢又烧钱:并发、重试和用量日志怎么一起排查
  • 浪琴官方售后维修服务全维度核验报告 - 浪琴中国售后维修中心
  • 快手爬虫终极指南:3步实现无水印视频批量下载
  • AD7490与MKV46F256VLH16在工业信号采集中的硬件设计与优化
  • LV3296与PIC18F66K40硬件架构及通信协议优化
  • 智能仪表板DevExpress Dashboard v24.1 - 新增级联参数过滤