Проблему решил!
Вот код решения:
/* /// Ранее сделано следующее
modelLSNTable = new QSqlTableModel(this);
modelLSNTable -> setTable("DeviceList");
modelLSNTable -> select();
listDBNumbers -> setModel(modelLSNTable);
listDBNumbers -> setSelectionBehavior(QAbstractItemView::SelectRows);
listDBNumbers -> setModelColumn(0);
modelRSNTable = new QSqlTableModel(this);
modelRSNTable -> setTable("DeviceList");
listResultNumbers -> setSelectionBehavior(QAbstractItemView::SelectRows);
listResultNumbers -> setModelColumn(0);
listResultNumbers -> setModel(modelRSNTable);
*/
/// Добавление серийного номера в список номеров для генерации лицензии
void LicenceBuilder::clickAddNumber()
{
QModelIndexList indexList = selLeft.indexes();
QString filter("");
foreach(QModelIndex index, indexList)
{
QSqlRecord record = modelLSNTable -> record(index.row());
QString serialNumber = record.value("serialNumber").toString();
if(!selectedSerialNumbers.contains(serialNumber, Qt::CaseInsensitive))
selectedSerialNumbers.append(serialNumber);
}
foreach(QString name, selectedSerialNumbers)
{
filter += QString("serialNumber = '%1'").arg(name);
if(name != selectedSerialNumbers.last())
filter += " or ";
}
modelRSNTable -> setFilter(filter);
modelRSNTable -> select();
listResultNumbers -> setModel(modelRSNTable);
connect(listResultNumbers -> selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
this, SLOT(calcRightCount(const QItemSelection&, const QItemSelection&)));
}
/// Удаление из списка ненужных серийных номеров
void LicenceBuilder::clickDelNumber()
{
QModelIndexList indexList = selRight.indexes();
QString filter("");
foreach(QModelIndex index, indexList)
{
QSqlRecord record = modelRSNTable -> record(index.row());
QString serialNumber = record.value("serialNumber").toString();
if(selectedSerialNumbers.contains(serialNumber, Qt::CaseInsensitive))
selectedSerialNumbers.removeAll(serialNumber);
}
foreach(QString name, selectedSerialNumbers)
{
filter += QString("serialNumber = '%1'").arg(name);
if(name != selectedSerialNumbers.last())
filter += " or ";
}
if(selectedSerialNumbers.isEmpty())
{
if(modelRSNTable) delete modelRSNTable;
modelRSNTable = new QSqlTableModel(this);
listResultNumbers -> setModel(modelRSNTable);
modelRSNTable -> setTable("DeviceList");
}
else
{
modelRSNTable -> setFilter(filter);
modelRSNTable -> select();
listResultNumbers -> setModel(modelRSNTable);
}
}
/// Вычисление количества выделенных элементов для левого списка
void LicenceBuilder::calcLeftCount(const QItemSelection& selected, const QItemSelection& deselected)
{
foreach(QItemSelectionRange item, selected)
selLeft.append(item);
foreach(QItemSelectionRange item, deselected)
selLeft.removeAll(item);
}
/// Вычисление количества выделенных элементов для правого списка
void LicenceBuilder::calcRightCount(const QItemSelection& selected, const QItemSelection& deselected)
{
foreach(QItemSelectionRange item, selected)
selRight.append(item);
foreach(QItemSelectionRange item, deselected)
selRight.removeAll(item);
}
clickAddNumber - слот добавления выделенных элементов из левого QListView в правый QListView
clickDelNumber - слот удаления выделенных элементов из правого QListView
calcLeftCount, calcRightCount - слоты выделения элементов в левом и в правом QListView
selRight, calcLeftCount - имеют тип QItemSelection
selectedSerialNumbers - тип QStringList
modelRSNTable, modelLSNTable - тип QSqlTableModel
listResultNumbers - правый QListView
listDBNumbers - левый QListView
Суть работы слота clickAddNumber:
- Просматриваем список индексов, каждое неповторяющееся значение, выбранное из БД, запоминаем в списке строк.
- Затем просматриваем полученный список строк и формируем строку фильтра (конструкция WHERE в SQL).
- Выполняем выборку из таблицы с обозначенным фильтром.