<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Manually selecting Items from a database]]></title><description><![CDATA[<p dir="auto">Gents;</p>
<p dir="auto">I am about to start coding a program that gives the user the choice of selecting items from a database. The database contains a table with few columns (reference, description, unit, price). The program connects to the database through a pushbutton and displays all the items in a dialog window, the user will be able to select the items he wants using a checkbox for example. My question is, is that  possible with sql database or is there any other way to do that.</p>
<p dir="auto">Regards;</p>
]]></description><link>https://forum.qt.io/topic/76422/manually-selecting-items-from-a-database</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 09:53:56 GMT</lastBuildDate><atom:link href="https://forum.qt.io/topic/76422.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 20 Feb 2017 23:33:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Manually selecting Items from a database on Tue, 21 Feb 2017 13:32:35 GMT]]></title><description><![CDATA[<p dir="auto">flaggableproxy.h</p>
<pre><code class="language-c++">#ifndef FLAGGABLEPROXY_H
#define FLAGGABLEPROXY_H

#include &lt;QSortFilterProxyModel&gt;

class FlaggableProxy : public QSortFilterProxyModel
{
    Q_OBJECT
	Q_DISABLE_COPY(FlaggableProxy)
public:
    explicit FlaggableProxy(QObject *parent=nullptr);
    virtual ~FlaggableProxy() = default;
    virtual Qt::ItemFlags flags(const QModelIndex &amp; index) const override;
    virtual void setFlagForColumn(qint32 col, Qt::ItemFlags val);
    virtual void removeFlagForColumn(qint32 col);
    virtual Qt::ItemFlags flagsForColumn(qint32 col) const;
    virtual void setFlagForRow(qint32 row, Qt::ItemFlags val);
    virtual void removeFlagForRow(qint32 row);
    virtual Qt::ItemFlags flagsForRow(qint32 row) const;
    virtual void setFlag(qint32 row, qint32 col, Qt::ItemFlags val);
    virtual void removeFlag(qint32 row, qint32 col);
    virtual Qt::ItemFlags getFlag(qint32 row, qint32 col)const;
    virtual void clearFlags();

    virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
    virtual void setSortRoleForColumn(qint32 col, int val);
    virtual int sortRoleForColumn(qint32 col) const;
    virtual void clearSortRoles();
private:
    QHash&lt;qint64, Qt::ItemFlags&gt; m_flagStorage;
    QHash&lt;qint32, Qt::ItemFlags&gt; m_rowFlagStorage;
    QHash&lt;qint32, Qt::ItemFlags&gt; m_colFlagStorage;
    QHash&lt;qint32, int&gt; m_sortRoles;
};
#endif // FLAGGABLEPROXY_H
</code></pre>
<p dir="auto">flaggableproxy.cpp</p>
<pre><code class="language-c++">#include "FlaggableProxy.h"

FlaggableProxy::FlaggableProxy(QObject *parent)
    : QSortFilterProxyModel(parent)
{

}


Qt::ItemFlags FlaggableProxy::flags(const QModelIndex &amp; idx) const
{
    const QModelIndex index = mapToSource(idx);
    const qint64 hashIndex = (static_cast&lt;qint64&gt;(index.row()) &lt;&lt; 32) | static_cast&lt;qint64&gt;(index.column());        
    if (m_flagStorage.contains(hashIndex))
        return m_flagStorage.value(hashIndex) | Qt::ItemNeverHasChildren;
    if (m_rowFlagStorage.contains(index.row()))
        return m_rowFlagStorage.value(index.row()) | Qt::ItemNeverHasChildren;
    if (m_colFlagStorage.contains(index.column()))
        return m_colFlagStorage.value(index.column()) | Qt::ItemNeverHasChildren;
    return QSortFilterProxyModel::flags(idx) | Qt::ItemNeverHasChildren;
}

void FlaggableProxy::setFlagForColumn(qint32 col, Qt::ItemFlags val)
{
    m_colFlagStorage[col] = val;
}

void FlaggableProxy::removeFlagForColumn(qint32 col)
{
    m_colFlagStorage.remove(col);
}

Qt::ItemFlags FlaggableProxy::flagsForColumn(qint32 col) const
{
    return m_colFlagStorage.value(col, QSortFilterProxyModel::flags(index(0, col)));
}

void FlaggableProxy::setFlagForRow(qint32 row, Qt::ItemFlags val)
{
    m_rowFlagStorage[row] = val;
}

void FlaggableProxy::removeFlagForRow(qint32 row)
{
    m_colFlagStorage.remove(row);
}

Qt::ItemFlags FlaggableProxy::flagsForRow(qint32 row) const
{
    return m_rowFlagStorage.value(row, QSortFilterProxyModel::flags(index(row, 0)));
}

void FlaggableProxy::setFlag(qint32 row, qint32 col, Qt::ItemFlags val)
{
    const qint64 hashIndex = (static_cast&lt;qint64&gt;(row) &lt;&lt; 32) | static_cast&lt;qint64&gt;(col);
    m_flagStorage[hashIndex] = val;
}

void FlaggableProxy::removeFlag(qint32 row, qint32 col)
{
    const qint64 hashIndex = (static_cast&lt;qint64&gt;(row) &lt;&lt; 32) | static_cast&lt;qint64&gt;(col);
    m_flagStorage.remove(hashIndex);
}

Qt::ItemFlags FlaggableProxy::getFlag(qint32 row, qint32 col) const
{
    const qint64 hashIndex = (static_cast&lt;qint64&gt;(row) &lt;&lt; 32) | static_cast&lt;qint64&gt;(col);
    return m_flagStorage.value(hashIndex, QSortFilterProxyModel::flags(index(row, col)));
}

void FlaggableProxy::clearFlags()
{
    m_flagStorage.clear();
    m_rowFlagStorage.clear();
    m_colFlagStorage.clear();
}

void FlaggableProxy::sort(int column, Qt::SortOrder order)
{
    setSortRole(m_sortRoles.value(column, sortRole()));
    QSortFilterProxyModel::sort(column, order);
}

void FlaggableProxy::setSortRoleForColumn(qint32 col, int val)
{
    if (val == Qt::DisplayRole) {
        m_sortRoles.remove(col);
        return;
    }
    m_sortRoles[col] = val;
}

int FlaggableProxy::sortRoleForColumn(qint32 col) const
{
    return m_sortRoles.value(col, Qt::DisplayRole);
}

void FlaggableProxy::clearSortRoles()
{
    m_sortRoles.clear();
}
</code></pre>
<p dir="auto">now:</p>
<pre><code>    enum ModelColumns{
        mcReference
        ,mcDescription
        ,mcUnit
        ,mcPrice
        ,mcQuantity
        ,mcTotalPrice
        
        ,ModColCount
    };
    
    QAbstractItemModel* m_model=new QStandardItemModel(this);
    m_model-&gt;insertColumns(0,ModColCount);
    m_model-&gt;setHeaderData(mcReference,Qt::Horizontal,QStringLiteral("Reference"));
    m_model-&gt;setHeaderData(mcDescription,Qt::Horizontal,QStringLiteral("Description"));
    m_model-&gt;setHeaderData(mcUnit,Qt::Horizontal,QStringLiteral("Unit"));
    m_model-&gt;setHeaderData(mcPrice,Qt::Horizontal,QStringLiteral("Price"));
    m_model-&gt;setHeaderData(mcQuantity,Qt::Horizontal,QStringLiteral("Quantity"));
    m_model-&gt;setHeaderData(mcTotalPrice,Qt::Horizontal,QStringLiteral("Total Price"));
    
    
    QSqlQuery dataQuery;
    dataQuery.prepare("select Reference,Description,Unit,Price from MyTable");
    if(dataQuery.exec()){
        while(dataQuery.next()){
            const QSqlRecord currRec= dataQuery.record();
            const int newRow=m_model-&gt;rowCount();
            m_model-&gt;insertRow(newRow);
            m_model-&gt;setData(m_model-&gt;index(newRow,mcReference),currRec.value(QStringLiteral("Reference")));
            m_model-&gt;setData(m_model-&gt;index(newRow,mcDescription),currRec.value(QStringLiteral("Description")));
            m_model-&gt;setData(m_model-&gt;index(newRow,mcUnit),currRec.value(QStringLiteral("Unit")));
            m_model-&gt;setData(m_model-&gt;index(newRow,mcPrice),currRec.value(QStringLiteral("Price")));
        }
    }
    
    connect(m_model,&amp;QAbstractItemModel::dataChanged,[=](const QModelIndex&amp; idx)-&gt;void{
        if(idx.column()==mcQuantity || idx.column()==mcPrice)
            m_model-&gt;setData(
                        m_model-&gt;index(id.row(),mcTotalPrice)
                        , m_model-&gt;index(id.row(),mcQuantity).data().toDouble()*m_model-&gt;index(id.row(),mcPrice).data().toDouble()
                        );
    });
    
    FlaggableProxy* dialogModelProxy = new FlaggableProxy(this);
    dialogModelProxy-&gt;setSourceModel(m_model);
    dialogModelProxy-&gt;setFlagForColumn(0,Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
    
    QSortFilterProxyModel* finalProxy = new QSortFilterProxyModel(this);
    finalProxy-&gt;setFilterKeyColumn(0);
    finalProxy-&gt;setFilterRole(Qt::CheckStateRole);
    finalProxy-&gt;setFilterFixedString(QString::number(Qt::Checked));
</code></pre>
<p dir="auto"><code>finalProxy</code> is the model for the <code>QTableView</code> that will replace the final <code>QTableWidget</code> and <code>dialogModelProxy</code> is the model for the <code>QTableView</code> in the dialog.</p>
<p dir="auto">you can use <code>QTableView::setColumnHidden</code> to decide which columns to hide in each table</p>
]]></description><link>https://forum.qt.io/post/377343</link><guid isPermaLink="true">https://forum.qt.io/post/377343</guid><dc:creator><![CDATA[VRonin]]></dc:creator><pubDate>Tue, 21 Feb 2017 13:32:35 GMT</pubDate></item><item><title><![CDATA[Reply to Manually selecting Items from a database on Tue, 21 Feb 2017 12:27:31 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/vronin">@<bdi>VRonin</bdi></a><br />
Absolutely not. The database is something fixed, kind of contract that I just want to take items from.</p>
<p dir="auto">cheers;</p>
]]></description><link>https://forum.qt.io/post/377321</link><guid isPermaLink="true">https://forum.qt.io/post/377321</guid><dc:creator><![CDATA[Abderaouf]]></dc:creator><pubDate>Tue, 21 Feb 2017 12:27:31 GMT</pubDate></item><item><title><![CDATA[Reply to Manually selecting Items from a database on Tue, 21 Feb 2017 08:47:08 GMT]]></title><description><![CDATA[<p dir="auto">I have two solutions but they depend on a very important question:<br />
Do any change done in either the Dialog or the final QTableWidget need to be reflected in the DB (i.e. if I change something in the app it gets changed in the database)?</p>
]]></description><link>https://forum.qt.io/post/377263</link><guid isPermaLink="true">https://forum.qt.io/post/377263</guid><dc:creator><![CDATA[VRonin]]></dc:creator><pubDate>Tue, 21 Feb 2017 08:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to Manually selecting Items from a database on Mon, 20 Feb 2017 23:44:56 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/sgaist">@<bdi>SGaist</bdi></a></p>
<p dir="auto">Yeah, I can display the database in a QSqlTableModel in the dialog window, the question is can I select manually the items I need and then display them in a QTablewidget where I can add the quantity of each item and calculate the price per row?</p>
]]></description><link>https://forum.qt.io/post/377221</link><guid isPermaLink="true">https://forum.qt.io/post/377221</guid><dc:creator><![CDATA[Abderaouf]]></dc:creator><pubDate>Mon, 20 Feb 2017 23:44:56 GMT</pubDate></item><item><title><![CDATA[Reply to Manually selecting Items from a database on Mon, 20 Feb 2017 23:39:29 GMT]]></title><description><![CDATA[<p dir="auto">Hi,</p>
<p dir="auto">Unless I misunderstand you can use a QSqlTableModel to show the content of the table you are interested in.</p>
<p dir="auto">Hope it helps</p>
]]></description><link>https://forum.qt.io/post/377219</link><guid isPermaLink="true">https://forum.qt.io/post/377219</guid><dc:creator><![CDATA[SGaist]]></dc:creator><pubDate>Mon, 20 Feb 2017 23:39:29 GMT</pubDate></item></channel></rss>