gpt4 book ai didi

c++ - 扩展 QStandardItem 不返回数据

转载 作者:行者123 更新时间:2023-11-30 04:59:58 27 4
gpt4 key购买 nike

我有一个自定义类 ConnectionStandardItem,它是 QStandardItem 的子类。此项应包含稍后在 QSqlDatabase 中使用的服务器、用户名、密码等信息。

ConnectionStandardItem::ConnectionStandardItem(QString const& connectionId) : QStandardItem()
{
QMap<QString, QVariant> m_connectionDefinition;
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "goat", "connections");

if (!connectionId.isEmpty())
{
settings.beginGroup(connectionId.trimmed());

m_connectionDefinition[connectionId] = QVariant(connectionId.trimmed());

foreach(QString key, settings.childKeys())
{
m_connectionDefinition[key] = settings.value(key);
}

setText(m_connectionDefinition["name"].toString());
setData(m_connectionDefinition, Qt::UserRole);

settings.endGroup();
}
}

在对话框中使用扩展的 QStandardItem:

NewConnectionDialog::NewConnectionDialog(QWidget *parent) : QDialog(parent), ui(new Ui::NewConnectionDialog) {
ui->setupUi(this);

m_model = new QStandardItemModel(this);
m_driversModel = new QStandardItemModel(this);
m_connectionListModel = new QStandardItemModel(this);

ui->listDropdownDBDriver->setModel(m_driversModel);
ui->listViewConnections->setModel(m_connectionListModel);

/* set combobox */
QStandardItem* item_psql = new QStandardItem();
item_psql->setText("PostgreSQL");
item_psql->setData("QPSQL", Qt::UserRole);
m_driversModel->appendRow(item_psql);

QStandardItem* item_mysql = new QStandardItem();
item_mysql->setText("MySQL/MariaDB");
item_mysql->setData("QMYSQL", Qt::UserRole);
m_driversModel->appendRow(item_mysql);

updateConnectionListModel();

connect(ui->listViewConnections->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(handleSelectionChanged(QItemSelection, QItemSelection)));
connect(m_connectionListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updateListViewItem(QStandardItem*)));
}

void NewConnectionDialog::handleSelectionChanged(QItemSelection current, QItemSelection previous) {
const QModelIndex index = ui->listViewConnections->currentIndex();
ConnectionStandardItem* connection = m_connectionListModel->itemFromIndex(index)->data().value<ConnectionStandardItem*>();


QMap<QString, QVariant> connectionDefinition = connection->data().value<QMap<QString, QVariant>>();

//ui->listDropdownDBDriver->setCurrentIndex(index);
ui->txtUser->setText(connectionDefinition["username"].toString());
ui->txtPass->setText(connectionDefinition["pass"].toString());
ui->txtServer->setText(connectionDefinition["server"].toString());
ui->txtPort->setText(connectionDefinition["port"].toString());
ui->txtDatabase->setText(connectionDefinition["database"].toString());
}

void NewConnectionDialog::updateConnectionListModel() {
QSettings settings(QSettings::IniFormat, QSettings::UserScope, "goat", "connections");

foreach(QString key, settings.childGroups())
{
ConnectionStandardItem* item = new ConnectionStandardItem(key);
m_connectionListModel->appendRow(item);
}
}

不幸的是,在对话框中,我无法访问当前所选项目的数据。我检查的方法是 handleSelectionChanged。

我如何从 ConnenctionStandardItem 中正确提取 Map 对象,以便更新 GUI,反之亦然,将 gui 中的更改发送回模型(并通过模型发送到 .ini 设置文件)?有没有更好的方法来解决这个问题(不同组织的类(class))?

最佳答案

ConnectionStandardItem 不是保存在QStandardItem 中的数据,但您必须从QStandardItem 中转换ConnectionStandardItem。

另一方面,您将数据保存在 Qt::UserRole 角色中:

setData(m_connectionDefinition, Qt::UserRole);

但是当使用 data() 时根据文档,您正在使用 Qt::UserRole + 1 角色:

QVariant QStandardItem::data(int role = Qt::UserRole + 1) const

解决方案如下:

void NewConnectionDialog::handleSelectionChanged(QItemSelection current, QItemSelection previous) {
const QModelIndex index = ui->listViewConnections->currentIndex();

QStandardItem *item = m_connectionListModel->itemFromIndex(index);
ConnectionStandardItem* connection = static_cast<ConnectionStandardItem*>(item); // <---
QMap<QString, QVariant> connectionDefinition = connection->data(Qt::UserRole).value<QMap<QString, QVariant>>(); // <---

//ui->listDropdownDBDriver->setCurrentIndex(index);
ui->txtUser->setText(connectionDefinition["username"].toString());
ui->txtPass->setText(connectionDefinition["pass"].toString());
ui->txtServer->setText(connectionDefinition["server"].toString());
ui->txtPort->setText(connectionDefinition["port"].toString());
ui->txtDatabase->setText(connectionDefinition["database"].toString());
}

尽管我看到转换也不是必需的,因为我们不打算使用 ConnectionStandardItem 中实现的方法,所以我们只能使用 QStandardItem:

void NewConnectionDialog::handleSelectionChanged(QItemSelection current, QItemSelection previous) {
const QModelIndex index = ui->listViewConnections->currentIndex();

QStandardItem *connection = m_connectionListModel->itemFromIndex(index);
QMap<QString, QVariant> connectionDefinition = connection->data(Qt::UserRole).value<QMap<QString, QVariant>>(); // <---

//ui->listDropdownDBDriver->setCurrentIndex(index);
ui->txtUser->setText(connectionDefinition["username"].toString());
ui->txtPass->setText(connectionDefinition["pass"].toString());
ui->txtServer->setText(connectionDefinition["server"].toString());
ui->txtPort->setText(connectionDefinition["port"].toString());
ui->txtDatabase->setText(connectionDefinition["database"].toString());
}

关于c++ - 扩展 QStandardItem 不返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50982143/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com