翻譯|使用教程|編輯:龔雪|2023-04-13 10:27:12.347|閱讀 175 次
概述:本文將為大家介紹Qt框架中的組合小部件映射器示例,歡迎下載相關組件體驗~
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用于超過70個行業、數千家企業,支持數百萬設備及應用。
Combo Widget Mapper(組合小部件映射器)示例展示了如何使用自定義委托將信息從模型映射到表單上的特定小部件。
在簡單小部件映射器()示例中,我們展示了小部件映射器的基本用法,將模型公開的數據與用戶界面中的簡單輸入小部件聯系起來。然而有時我們希望使用輸入小部件將數據作為選項公開給用戶,例如QComboBox,并且需要一種方法將用戶的輸入與存儲在模型中的值關聯起來。
這個示例與簡單部件映射器示例非常相似,同樣創建了一個具有幾乎相同用戶界面的Window類,除了提供一個旋轉框以便輸入每個人的年齡之外,還提供了一個組合框來允許他們的地址被分類為“Home”、“Work”或“Other”。
Qt技術交流群:166830288 歡迎一起進群討論
這個類提供了一個構造函數,一個插槽來保持按鈕的更新,以及一個私有函數來設置模型:
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;
};
除了對象和用于組成用戶界面的控件之外,我們還使用保存數據,使用保存關于可以應用于每個人的數據的地址類型的信息。
Window類的構造函數可以分三部分解釋,在第一部分中,我們設置了用于用戶界面的小部件:
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);
請注意,我們以與其他小部件相同的方式設置組合框映射,但是將組合框自己的模型應用到組合框上,以便組合框將顯示來自它自己的模型typeModel的數據,替代來自包含關于每個人的數據的模型。
接下來,我們設置小部件映射器,將每個輸入小部件與調用()指定的模型中的列關聯起來:
mapper = new QDataWidgetMapper(this); mapper->setModel(model); mapper->addMapping(nameEdit, 0); mapper->addMapping(addressEdit, 1); mapper->addMapping(typeComboBox, 2, "currentIndex");
對于組合框,我們傳遞一個額外的參數來告訴小部件映射器哪個屬性與模型中的值相關。因此,用戶能夠從組合框中選擇一個項目,存儲在小部件currentIndex屬性中的相應值將存儲在模型中。
構造函數的其余部分非常類似于簡單部件映射器示例:
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()函數中初始化,在這里,我們創建了一個5行3列的標準模型。在每一行中插入一個名稱、地址和一個指示地址類型的值,地址類型存儲在字符串列表模型中。
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);
}
}
當我們將每一行插入模型時,就像數據庫中的記錄一樣,存儲了對應于每個人的地址類型的typeModel中的項的值。當小部件映射器從每行的最后一列讀取這些值時,它將需要使用它們作為typeModel中值的引用,如下圖所示。
為了完整起見,我們展示了updateButtons()插槽的實現:
void Window::updateButtons(int row)
{
previousButton->setEnabled(row > 0);
nextButton->setEnabled(row < model->rowCount() - 1);
}
組合框單獨模型的使用提供了一個選項菜單,這些選項與存儲在主模型中的數據是分開的。使用將組合框的currentIndex屬性與模型中的列相關聯的命名映射,可以有效地在模型中存儲查找值。
然而,在小部件映射器上下文之外讀取模型時,我們需要了解typeModel,以便理解這些查找值。如果能夠將數據和typeModel所持有的選項都存儲在一個地方,將會非常有用。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉載自:慧都網