溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Qt如何實(shí)現(xiàn)動(dòng)態(tài)屬性

發(fā)布時(shí)間:2021-12-15 10:19:31 來(lái)源:億速云 閱讀:772 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章將為大家詳細(xì)講解有關(guān)Qt如何實(shí)現(xiàn)動(dòng)態(tài)屬性,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

一、前言

之前就提過(guò),Qt的屬性機(jī)制強(qiáng)大到爆,這次的動(dòng)態(tài)屬性功能就是要讓他爆,很難想象只要一行代碼即可widget->setProperty("value", value);沒(méi)錯(cuò)就這么簡(jiǎn)單,調(diào)用弱屬性機(jī)制,可以直接控制控件中的所有屬性,設(shè)計(jì)這個(gè)機(jī)制的人絕對(duì)是天才,直接跪了。至于具體底層是怎么實(shí)現(xiàn)的,這個(gè)可以先不管,也沒(méi)有太多精力再去研究Qt的源碼了,那個(gè)源碼非常龐大,研究源碼的時(shí)候最快的辦法是搜索直接定位對(duì)應(yīng)文件。本設(shè)計(jì)器除了提供文本框輸入值進(jìn)行動(dòng)態(tài)改變控件屬性以外,還提供了了滑動(dòng)條、隨機(jī)模擬數(shù)據(jù)、串口采集數(shù)據(jù)、網(wǎng)絡(luò)采集數(shù)據(jù)、數(shù)據(jù)庫(kù)采集數(shù)據(jù)等多種方式獲取數(shù)據(jù)源。 這里不得不提下一個(gè)牛逼的技巧:QLabel有三種設(shè)置文本的方法,掌握好Qt的屬性系統(tǒng),舉一反三,可以做出很多效果。

ui->label->setStyleSheet("qproperty-text:hello;");
ui->label->setProperty("text", "hello");
ui->label->setText("hello");

二、實(shí)現(xiàn)的功能

  1. 自動(dòng)加載插件文件中的所有控件生成列表,默認(rèn)自帶的控件超過(guò)120個(gè)。

  2. 拖曳到畫(huà)布自動(dòng)生成對(duì)應(yīng)的控件,所見(jiàn)即所得。

  3. 右側(cè)中文屬性欄,改變對(duì)應(yīng)的屬性立即應(yīng)用到對(duì)應(yīng)選中控件,直觀(guān)簡(jiǎn)潔,非常適合小白使用。

  4. 獨(dú)創(chuàng)屬性欄文字翻譯映射機(jī)制,效率極高,可以非常方便拓展其他語(yǔ)言的屬性欄。

  5. 所有控件的屬性自動(dòng)提取并顯示在右側(cè)屬性欄,包括枚舉值下拉框等。

  6. 支持手動(dòng)選擇插件文件,外部導(dǎo)入插件文件。

  7. 可以將當(dāng)前畫(huà)布的所有控件配置信息導(dǎo)出到xml文件。

  8. 可以手動(dòng)選擇xml文件打開(kāi)控件布局,自動(dòng)根據(jù)xml文件加載控件。

  9. 可拉動(dòng)滑動(dòng)條、勾選模擬數(shù)據(jù)復(fù)選框、文本框輸入,三種方式來(lái)生成數(shù)據(jù)應(yīng)用所有控件。

  10. 控件支持八個(gè)方位拉動(dòng)調(diào)整大小,自適應(yīng)任意分辨率,可鍵盤(pán)上下左右微調(diào)位置。

  11. 打通了串口采集、網(wǎng)絡(luò)采集、數(shù)據(jù)庫(kù)采集三種方式設(shè)置數(shù)據(jù)。

  12. 代碼極其精簡(jiǎn),注釋非常詳細(xì),可以作為組態(tài)的雛形,自行拓展更多的功能。

  13. 純Qt編寫(xiě),支持任意Qt版本+任意編譯器+任意系統(tǒng)。

三、效果圖

Qt如何實(shí)現(xiàn)動(dòng)態(tài)屬性

四、核心代碼

void frmMain::initForm()
{
    //初始化中英屬性對(duì)照表
    QtPropertyName::initMap();

    //設(shè)置沒(méi)有關(guān)閉按鈕
    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();

    //綁定數(shù)據(jù)源窗體的數(shù)值改變信號(hào)
    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);

    //初始化隨機(jī)數(shù)種子
    QTime t = QTime::currentTime();
    qsrand(t.msec() + t.second() * 1000);

    //定時(shí)器模擬隨機(jī)值賦值給控件
    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);
    }
}

關(guān)于“Qt如何實(shí)現(xiàn)動(dòng)態(tài)屬性”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI