翻譯|使用教程|編輯:龔雪|2023-04-13 10:27:12.347|閱讀 157 次
概述:本文將為大家介紹Qt框架中的組合小部件映射器示例,歡迎下載相關(guān)組件體驗(yàn)~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Qt 是目前最先進(jìn)、最完整的跨平臺(tái)C++開(kāi)發(fā)工具。它不僅完全實(shí)現(xiàn)了一次編寫,所有平臺(tái)無(wú)差別運(yùn)行,更提供了幾乎所有開(kāi)發(fā)過(guò)程中需要用到的工具。如今,Qt已被運(yùn)用于超過(guò)70個(gè)行業(yè)、數(shù)千家企業(yè),支持?jǐn)?shù)百萬(wàn)設(shè)備及應(yīng)用。
Combo Widget Mapper(組合小部件映射器)示例展示了如何使用自定義委托將信息從模型映射到表單上的特定小部件。
在簡(jiǎn)單小部件映射器()示例中,我們展示了小部件映射器的基本用法,將模型公開(kāi)的數(shù)據(jù)與用戶界面中的簡(jiǎn)單輸入小部件聯(lián)系起來(lái)。然而有時(shí)我們希望使用輸入小部件將數(shù)據(jù)作為選項(xiàng)公開(kāi)給用戶,例如QComboBox,并且需要一種方法將用戶的輸入與存儲(chǔ)在模型中的值關(guān)聯(lián)起來(lái)。
這個(gè)示例與簡(jiǎn)單部件映射器示例非常相似,同樣創(chuàng)建了一個(gè)具有幾乎相同用戶界面的Window類,除了提供一個(gè)旋轉(zhuǎn)框以便輸入每個(gè)人的年齡之外,還提供了一個(gè)組合框來(lái)允許他們的地址被分類為“Home”、“Work”或“Other”。
Qt技術(shù)交流群:166830288 歡迎一起進(jìn)群討論
這個(gè)類提供了一個(gè)構(gòu)造函數(shù),一個(gè)插槽來(lái)保持按鈕的更新,以及一個(gè)私有函數(shù)來(lái)設(shè)置模型:
class Window : public QWidget { Q_OBJECT public: Window(QWidget *parent = nullptr); private slots: void updateButtons(int row); private: void setupModel(); QLabel *nameLabel; QLabel *addressLabel; QLabel *typeLabel; QLineEdit *nameEdit; QTextEdit *addressEdit; QComboBox *typeComboBox; QPushButton *nextButton; QPushButton *previousButton; QStandardItemModel *model; QStringListModel *typeModel; QDataWidgetMapper *mapper; };
除了對(duì)象和用于組成用戶界面的控件之外,我們還使用保存數(shù)據(jù),使用保存關(guān)于可以應(yīng)用于每個(gè)人的數(shù)據(jù)的地址類型的信息。
Window類的構(gòu)造函數(shù)可以分三部分解釋,在第一部分中,我們?cè)O(shè)置了用于用戶界面的小部件:
Window::Window(QWidget *parent) : QWidget(parent) { setupModel(); nameLabel = new QLabel(tr("Na&me:")); nameEdit = new QLineEdit(); addressLabel = new QLabel(tr("&Address:")); addressEdit = new QTextEdit(); typeLabel = new QLabel(tr("&Type:")); typeComboBox = new QComboBox(); nextButton = new QPushButton(tr("&Next")); previousButton = new QPushButton(tr("&Previous")); nameLabel->setBuddy(nameEdit); addressLabel->setBuddy(addressEdit); typeLabel->setBuddy(typeComboBox); typeComboBox->setModel(typeModel);
請(qǐng)注意,我們以與其他小部件相同的方式設(shè)置組合框映射,但是將組合框自己的模型應(yīng)用到組合框上,以便組合框?qū)@示來(lái)自它自己的模型typeModel的數(shù)據(jù),替代來(lái)自包含關(guān)于每個(gè)人的數(shù)據(jù)的模型。
接下來(lái),我們?cè)O(shè)置小部件映射器,將每個(gè)輸入小部件與調(diào)用()指定的模型中的列關(guān)聯(lián)起來(lái):
mapper = new QDataWidgetMapper(this); mapper->setModel(model); mapper->addMapping(nameEdit, 0); mapper->addMapping(addressEdit, 1); mapper->addMapping(typeComboBox, 2, "currentIndex");
對(duì)于組合框,我們傳遞一個(gè)額外的參數(shù)來(lái)告訴小部件映射器哪個(gè)屬性與模型中的值相關(guān)。因此,用戶能夠從組合框中選擇一個(gè)項(xiàng)目,存儲(chǔ)在小部件currentIndex屬性中的相應(yīng)值將存儲(chǔ)在模型中。
構(gòu)造函數(shù)的其余部分非常類似于簡(jiǎn)單部件映射器示例:
connect(previousButton, &QAbstractButton::clicked, mapper, &QDataWidgetMapper::toPrevious); connect(nextButton, &QAbstractButton::clicked, mapper, &QDataWidgetMapper::toNext); connect(mapper, &QDataWidgetMapper::currentIndexChanged, this, &Window::updateButtons); 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(typeLabel, 3, 0, 1, 1); layout->addWidget(typeComboBox, 3, 1, 1, 1); setLayout(layout); setWindowTitle(tr("Delegate Widget Mapper")); mapper->toFirst(); }
模型在窗口的setupModel()函數(shù)中初始化,在這里,我們創(chuàng)建了一個(gè)5行3列的標(biāo)準(zhǔn)模型。在每一行中插入一個(gè)名稱、地址和一個(gè)指示地址類型的值,地址類型存儲(chǔ)在字符串列表模型中。
void Window::setupModel() { QStringList items; items << tr("Home") << tr("Work") << tr("Other"); typeModel = new QStringListModel(items, this); 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 types; types << "0" << "1" << "2" << "0" << "2"; 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(types[row]); model->setItem(row, 2, item); } }
當(dāng)我們將每一行插入模型時(shí),就像數(shù)據(jù)庫(kù)中的記錄一樣,存儲(chǔ)了對(duì)應(yīng)于每個(gè)人的地址類型的typeModel中的項(xiàng)的值。當(dāng)小部件映射器從每行的最后一列讀取這些值時(shí),它將需要使用它們作為typeModel中值的引用,如下圖所示。
為了完整起見(jiàn),我們展示了updateButtons()插槽的實(shí)現(xiàn):
void Window::updateButtons(int row) { previousButton->setEnabled(row > 0); nextButton->setEnabled(row < model->rowCount() - 1); }
組合框單獨(dú)模型的使用提供了一個(gè)選項(xiàng)菜單,這些選項(xiàng)與存儲(chǔ)在主模型中的數(shù)據(jù)是分開(kāi)的。使用將組合框的currentIndex屬性與模型中的列相關(guān)聯(lián)的命名映射,可以有效地在模型中存儲(chǔ)查找值。
然而,在小部件映射器上下文之外讀取模型時(shí),我們需要了解typeModel,以便理解這些查找值。如果能夠?qū)?shù)據(jù)和typeModel所持有的選項(xiàng)都存儲(chǔ)在一個(gè)地方,將會(huì)非常有用。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)