日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt5 中 关于Widget Mapper的简单应用

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt5 中 关于Widget Mapper的简单应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

近期,在解讀一個項目的Demo時,用到了不少Qt 開發的一些技術,其中有一個內容就是Wigdet Mapper功能。有些看不明白,對照《QtCreator快速入門》這本書的相關介紹,才知道這是有關模型、視圖編程的內容。在處理一些大容量數據上會很方便。

數據-窗口映射器(QDataWidgetMapper)類在數據模型的一個區域和一個窗口部件提供了一個映射。這樣就可以實現在一個窗口部件上顯示和編輯一個模型中的一行數據。

Qt5 的官方提供了一個簡單的實例 效果如下:
這個實例非常簡單,首先會創建一個窗體(window),該窗體的一些部件會顯示一些數據。通過按鈕可是顯示數據模型中的不同記錄。

具體實現過程如下:

定義一個窗體的類用來實現4項內容:
1、構造窗體
2、添加信號槽用于更新記錄
3、私有對象中添加實現建立數據模型的函數
4、以代碼方式添加相關的控件。

class Window : public QWidget{Q_OBJECTpublic:Window(QWidget *parent = nullptr);private slots:void updateButtons(int row);private:void setupModel();QLabel *nameLabel;QLabel *addressLabel;QLabel *ageLabel;QLineEdit *nameEdit;QTextEdit *addressEdit;QSpinBox *ageSpinBox;QPushButton *nextButton;QPushButton *previousButton;QStandardItemModel *model;QDataWidgetMapper *mapper;};

這里,數據-窗口映射器(QDataWidgetMapper)來實現用戶的接口。
標準數據模型來處理數據。

窗體類的實現

窗體的構造函數實現三個部分
1、創建控件,并且將標簽(Lable)和輸入部件(input Widget)建立伙伴關系。

Window::Window(QWidget *parent): QWidget(parent){setupModel();nameLabel = new QLabel(tr("Na&me:"));nameEdit = new QLineEdit();addressLabel = new QLabel(tr("&Address:"));addressEdit = new QTextEdit();ageLabel = new QLabel(tr("A&ge (in years):"));ageSpinBox = new QSpinBox();nextButton = new QPushButton(tr("&Next"));previousButton = new QPushButton(tr("&Previous"));nameLabel->setBuddy(nameEdit);addressLabel->setBuddy(addressEdit);ageLabel->setBuddy(ageSpinBox);

2、建立控件的映射(widget mapper),同時通過按鈕(Next)和按鈕(Previous)分別與信號槽 toNext() 和 toPrevious() 相連接。

mapper = new QDataWidgetMapper(this);mapper->setModel(model);mapper->addMapping(nameEdit, 0);mapper->addMapping(addressEdit, 1);mapper->addMapping(ageSpinBox, 2);connect(previousButton, &QAbstractButton::clicked, mapper, &QDataWidgetMapper::toPrevious);connect(nextButton, &QAbstractButton::clicked, mapper, &QDataWidgetMapper::toNext);connect(mapper, &QDataWidgetMapper::currentIndexChanged, this, &Window::updateButtons);

3、通過柵格化布局窗體部件的呈現方式,同時也設置好窗體的名稱,并將數據定位到數據模型的最前面一項。

QGridLayout *layout = new QGridLayout();layout->addWidget(nameLabel, 0, 0, 1, 1);layout->addWidget(nameEdit, 0, 1, 1, 1);layout->addWidget(previousButton, 0, 2, 1, 1);layout->addWidget(addressLabel, 1, 0, 1, 1);layout->addWidget(addressEdit, 1, 1, 2, 1);layout->addWidget(nextButton, 1, 2, 1, 1);layout->addWidget(ageLabel, 3, 0, 1, 1);layout->addWidget(ageSpinBox, 3, 1, 1, 1);setLayout(layout);setWindowTitle(tr("Simple Widget Mapper"));mapper->toFirst();

建立數據模型

setupModel()函數建立5行3列的標準數據模型,同時,初始化相關的一些數據

void Window::setupModel(){model = new QStandardItemModel(5, 3, this);QStringList names;names << "Alice" << "Bob" << "Carol" << "Donald" << "Emma";QStringList addresses;addresses << "<qt>123 Main Street<br/>Market Town</qt>"<< "<qt>PO Box 32<br/>Mail Handling Service""<br/>Service City</qt>"<< "<qt>The Lighthouse<br/>Remote Island</qt>"<< "<qt>47338 Park Avenue<br/>Big City</qt>"<< "<qt>Research Station<br/>Base Camp<br/>Big Mountain</qt>";QStringList ages;ages << "20" << "31" << "32" << "19" << "26";for (int row = 0; row < 5; ++row) {QStandardItem *item = new QStandardItem(names[row]);model->setItem(row, 0, item);item = new QStandardItem(addresses[row]);model->setItem(row, 1, item);item = new QStandardItem(ages[row]);model->setItem(row, 2, item);}}

這樣,就實現了數據模型與窗體控件的對應關系:


這樣,基本就實現了。如果想讓導航按鈕(previous 、next)的顯示更友好,可以添加下面的代碼:

void Window::updateButtons(int row){previousButton->setEnabled(row > 0);nextButton->setEnabled(row < model->rowCount() - 1);}

總結

以上是生活随笔為你收集整理的Qt5 中 关于Widget Mapper的简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。