crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Поиск в модели из скрипта, по коду ШК
JohnZ
  опции профиля:
сообщение 4.5.2017, 10:58
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Всем здравия !

Есть такой класс объекта...
Раскрывающийся текст

class fpForma : public QDialog
{
Q_OBJECT

public:

fpForma(int id, MainWindow *parent = 0, Qt::WindowFlags f = 0);
~fpForma();

bool initForm(int Cmd = 0);

public slots:

void save();
void submit();

private:

QSqlTableModel *model;
QTableView *view;

QModelIndex curIndex;
QSqlRecord curRecord;
};

И его класс модели, почти стандартный ...
Раскрывающийся текст

class fpTableModel : public QSqlTableModel
{
public:
fpTableModel(QObject * parent = 0, QSqlDatabase db = QSqlDatabase());
~fpTableModel();

QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
void setTable ( const QString & tableName );
int columnCount(const QModelIndex &parent = QModelIndex()) const;
void setDefFields(QStringList & df);

private:
int colsInList, colsInForm;
QStringList DefFields;
};

Таблица, обслуживаемая этим объектом имеет примерно такую структуру
    
   Код            char(6)
   Наименование    char(32)
   КодШК            char(16)   <-- Штрих-Код
   Остаток        int
   Цена            double


Выглядит это примерно как на картинке в прицепе ...
В скрипте загружаем и инициализируем драйвер сканера ШК
function frm579Create()
{
    nstr = kodc = 0;

    if (this["bcs0018"] == undefined)
        scanerStatus = mw.loadExtension("bcs0018")

    if (scanerStatus == 0)
    {
        scanerStatus = bcs0018.start();
        bcs0018.BarCodeReady.connect(this, this.frm579bcs);
    }
}


Функцмя скрипта на которую прицеплен сканер ШК
function frm579bcs(skod)
{
//  debugger

    bcs =  skod;
    stablo.text = skod;
}

Код со сканера в ф-цию приходит ! Код ШК является невидимой колонкой !

Сам объект fpForma в скрипте виден как frm579 ...
И вотЪ теперь вопрос, - как в объекте fpForma организовать поиск и позиционирование на нужную строку ?
Ведь доступа к модели из скрипта у меня нет ?! :-(
Заранее благодарен за помощь !!!

Сообщение отредактировал JohnZ - 4.5.2017, 11:12
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 8.5.2017, 15:43
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Народ, аууууу Неужели никаких идей ?

Нарыл в нете более-менее подходящий вариант с использованием

QModelIndexList QAbstractItemModel::match ( .... ) const

но как ей "объяснить" в какой колонке искать не знаю :(

И кроме того, как пишут на prog.ru если юзер не скролил до конца таблицы,
т.е. данные не кешированы полностью, match практически беЗполезен :(
По-крайней мере для куте 4.3 так было ...


Сообщение отредактировал JohnZ - 8.5.2017, 15:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 19.5.2017, 12:26
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 131
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Решилось с пом-ю prog.org.ru

Раскрывающийся текст

bool fpQForma::match(int col, QVariant value, bool seek)
{
QModelIndex idx;
int row_count = model->rowCount();

for(int i = 0;i < row_count;i++)
{
idx = model->index(i, col);
if( model->data(idx) == value)
{
if (seek)
viewChild->setCurrentIndex(idx);
return(true);
}
}
return(false);
}

Не самое лучшее решение, но работает ! На 2-3 тыс записей ищет довольно быстро ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.10.2019, 22:14