以前就提過,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); } }