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