首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展QStandardItem不返回数据

扩展QStandardItem不返回数据
EN

Stack Overflow用户
提问于 2018-06-22 06:45:21
回答 1查看 537关注 0票数 2

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

代码语言:javascript
复制
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在对话框中使用:

代码语言:javascript
复制
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设置文件)?是否有更好的方法来处理这个(不同组织的类)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-22 07:36:38

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

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

代码语言:javascript
复制
setData(m_connectionDefinition, Qt::UserRole);

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

代码语言:javascript
复制
QVariant QStandardItem::data(int role = Qt::UserRole + 1) const

解决方案是下一个:

代码语言:javascript
复制
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

代码语言:javascript
复制
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());
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50982143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档