Qt5 中 关于Widget Mapper的简单应用
近期,在解讀一個項目的Demo時,用到了不少Qt 開發的一些技術,其中有一個內容就是Wigdet Mapper功能。有些看不明白,對照《QtCreator快速入門》這本書的相關介紹,才知道這是有關模型、視圖編程的內容。在處理一些大容量數據上會很方便。
數據-窗口映射器(QDataWidgetMapper)類在數據模型的一個區域和一個窗口部件提供了一個映射。這樣就可以實現在一個窗口部件上顯示和編輯一個模型中的一行數據。
Qt5 的官方提供了一個簡單的實例 效果如下:
這個實例非常簡單,首先會創建一個窗體(window),該窗體的一些部件會顯示一些數據。通過按鈕可是顯示數據模型中的不同記錄。
具體實現過程如下:
定義一個窗體的類用來實現4項內容:
1、構造窗體
2、添加信號槽用于更新記錄
3、私有對象中添加實現建立數據模型的函數
4、以代碼方式添加相關的控件。
這里,數據-窗口映射器(QDataWidgetMapper)來實現用戶的接口。
標準數據模型來處理數據。
窗體類的實現
窗體的構造函數實現三個部分
1、創建控件,并且將標簽(Lable)和輸入部件(input Widget)建立伙伴關系。
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)的顯示更友好,可以添加下面的代碼:
總結
以上是生活随笔為你收集整理的Qt5 中 关于Widget Mapper的简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt 模型视图编程的简单实例
- 下一篇: Qt 控制台 使用connect连接信号