以前就提过,Qt的属性机制强大到爆,此次的动态属性功能就是要让他爆,很难想象只要一行代码便可widget->setProperty("value", value);没错就这么简单,调用弱属性机制,能够直接控制控件中的全部属性,设计这个机制的人绝对是天才,直接跪了。至于具体底层是怎么实现的,这个能够先无论,也没有太多精力再去研究Qt的源码了,那个源码很是庞大,研究源码的时候最快的办法是搜索直接定位对应文件。本设计器除了提供文本框输入值进行动态改变控件属性之外,还提供了了滑动条、随机模拟数据、串口采集数据、网络采集数据、数据库采集数据等多种方式获取数据源。 这里不得不提下一个牛逼的技巧:QLabel有三种设置文本的方法,掌握好Qt的属性系统,触类旁通,能够作出不少效果。linux
ui->label->setStyleSheet("qproperty-text:hello;"); ui->label->setProperty("text", "hello"); ui->label->setText("hello");
体验地址:https://pan.baidu.com/s/1A5Gd77kExm8Co5ckT51vvQ 提取码:877p 文件:可执行文件.zipc++
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<QWidget *> widgets = ui->centralwidget->findChildren<QWidget *>(); foreach (QWidget *widget, widgets) { widget->setProperty("value", value); } }