Qt编撰控件属性设计器6-动态属性
优采云 发布时间: 2020-08-27 06:13Qt编撰控件属性设计器6-动态属性
一、前言
之前就提过,Qt的属性机制强悍到爆,这次的动态属性功能就是要使他爆,很难想像只要一行代码即可widget->setProperty("value", value);没错就那么简单,调用弱属性机制,可以直接控制控件中的所有属性,设计这个机制的人绝对是天才,直接跪了。至于具体底层是如何实现的,这个可以先不管,也没有太多精力再去研究Qt的源码了,那个源码十分庞大,研究源码的时侯最快的办法是搜索直接定位对应文件。本设计器不仅提供文本框输入值进行动态改变控件属性以外,还提供了了滑动条、随机模拟数据、串口采集数据、网络采集数据、数据库采集数据等多种方法获取数据源。 这里不得不提下一个牛逼的方法:QLabel有三种设置文本的方式,掌握好Qt的属性系统,举一反三,可以作出好多疗效。
ui->label->setStyleSheet("qproperty-text:hello;");
ui->label->setProperty("text", "hello");
ui->label->setText("hello");
体验地址:/s/1A5Gd77kExm8Co5ckT51vvQ 提取码:877p 文件:可执行文件.zip
二、实现的功能手动加载插件文件中的所有控件生成列表,默认自带的控件超过120个。拖曳到画布手动生成对应的控件,所见即所得。右侧英文属性栏,改变对应的属性立刻应用到对应选中控件,直观简约,非常适宜小白使用。独创属性栏文字翻译映射机制,效率极高,可以十分便捷拓展其他语言的属性栏。所有控件的属性手动提取并显示在左侧属性栏,包括枚举值下拉框等。支持自动选择插件文件,外部导出插件文件。可以将当前画布的所有控件配置信息导入到xml文件。可以自动选择xml文件打开控件布局,自动按照xml文件加载控件。可带动滑动条、勾选模拟数据复选框、文本框输入,三种形式来生成数据应用所有控件。控件支持八个方位带动调整大小,自适应任意帧率,可按键上下左右微调位置。打通了并口采集、网络采集、数据库采集三种形式设置数据。代码非常精简,注释十分详尽,可以作为组态的雏型,自行拓展更多的功能。纯Qt编撰,支持任意Qt版本+任意编译器+任意系统。三、效果图
四、核心代码
void frmMain::initForm()
{
//初始化中英属性对照表
QtPropertyName::initMap();
//设置没有关闭按钮
ui->dockWidgetControl->setFixedWidth(200);
ui->dockWidgetData->setFixedWidth(200);
ui->dockWidgetProperty->setFixedWidth(220);
ui->dockWidgetControl->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
ui->dockWidgetProperty->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
ui->dockWidgetData->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
this->tabifyDockWidget(ui->dockWidgetControl, ui->dockWidgetData);
ui->dockWidgetControl->raise();
//绑定数据源窗体的数值改变信号
connect(ui->dockWidgetContentsData, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int)));
//允许拖曳接收
this->setAcceptDrops(true);
bgPix = QPixmap(":/image/bg.png");
//居中显示窗体
int frmX = this->width();
int frmY = this->height();
QDesktopWidget w;
int deskWidth = w.availableGeometry().width();
int deskHeight = w.availableGeometry().height();
QPoint movePoint(deskWidth / 2 - frmX / 2, deskHeight / 2 - frmY / 2);
this->move(movePoint);
//初始化随机数*敏*感*词*
QTime t = QTime::currentTime();
qsrand(t.msec() + t.second() * 1000);
//定时器模拟随机值赋值给控件
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(setValue()));
timer->setInterval(2000);
}
void frmMain::setValue()
{
int value = qrand() % 100;
valueChanged(value);
}
void frmMain::valueChanged(int value)
{
QList widgets = ui->centralwidget->findChildren();
foreach (QWidget *widget, widgets) {
widget->setProperty("value", value);
}
}
五、控件介绍超过150个精致控件,涵盖了各类仪表盘、进度条、进度球、指南针、曲线图、标尺、温度计、导航条、导航栏,flatui、高亮按键、滑动选择器、农历等。远超qwt集成的控件数目。每个类都可以独立成一个单独的控件,零耦合,每个控件一个头文件和一个实现文件,不依赖其他文件,方便单个控件以源码方式集成到项目中,较少代码量。qwt的控件类环环相扣,高度耦合,想要使用其中一个控件,必须收录所有的代码。全部纯Qt编撰,QWidget+QPainter勾画,支持Qt4.6到Qt5.12的任何Qt版本,支持mingw、msvc、gcc等编译器,支持任意操作系统例如windows+linux+mac+嵌入式linux等,不乱码,可直接集成到Qt Creator中,和自带的控件一样使用,大部分疗效只要设置几个属性即可,极为便捷。每个控件都有一个对应的单独的收录该控件源码的DEMO,方便参考使用。同时还提供一个所有控件使用的集成的DEMO。每个控件的源代码都有详尽英文注释,都依照统一设计规范编撰,方便学习自定义控件的编撰。每个控件默认配色和demo对应的配色都十分精致。超过130个可见控件,6个不可见控件。
部分控件提供多种款式风格选择,多种指示器款式选择。所有控件自适应窗体拉伸变化。集成自定义控件属性设计器,支持拖曳设计,所见即所得,支持导出导入xml格式。自带activex控件demo,所有控件可以直接运行在ie浏览器中。集成fontawesome图形字体+阿里巴巴iconfont采集的几百个图形字体,享受图形字体带来的乐趣。所有控件最后生成一个动态库文件(dll或则so等),可以直接集成到qtcreator中拖曳设计使用。目前早已有qml版本,后期会考虑出pyqt版本,如果用户需求量很大的话。自定义控件插件开放动态库使用(永久免费),无任何侧门和限制,请放心使用。目前已提供26个版本的dll,其中*敏*感*词*和规划系列书《大话程序员》《程序员的成长课》《解忧程序员》,受益匪浅,受益终身!SDK下载链接:/s/1A5Gd77kExm8Co5ckT51vvQ 提取码:877p