扩展 QStandardItem 不会返回数据
Extending QStandardItem doesnt return data
我有一个自定义类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);
}
}
不幸的是,在对话框中,我无法访问当前所选项目的数据。我正在检查的方法是句柄选择已更改。
如何从连接标准项中正确提取映射对象,以便我可以更新 GUI,反之亦然,将 gui 中的更改发送回模型(并通过模型发送到.ini设置文件(? 有没有更好的方法来解决这个问题(组织不同的课程(?
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++中返回数据结构的函数?
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- FFmpeg av_read_frame从音频流返回数据包
- 扩展 QStandardItem 不会返回数据
- C++ 根据给定的类型名从变量返回数据
- YAML-CPP的顺序返回数据
- 从全局 CUDA 函数返回数据
- C++ ostream 从对象数组返回数据
- 现代C++.从继续执行的工作线程返回数据结构
- 使用 JNI 通过从C++到 Java 的指针返回数据
- 为什么返回数据结构而不是指针弄乱了我的数据的完整性
- C++Curl,如何读取返回数据
- WSARecv()能否立即返回数据
- 处理 char * 的正确方法在 swig/python 中返回数据
- 如何使用 cppunit 断言宏来检查返回数据类型的预处理器值
- C++函数,不返回返回数据
- 通过.NET中的指针从本机方法返回数据
- 从if语句返回数据
- 更快地以数组形式返回数据的c++接口
- 模板,在派生类中返回数据的通用方法