Russian Qt Forum

Qt => Model-View (MV) => Тема начата: core от Январь 26, 2011, 21:24



Название: QAbstractItemModel : клик на текущей строке
Отправлено: core от Январь 26, 2011, 21:24
Есть QAbstractItemModel обьект с 5 столбцов и N строк. При клике на строку нужно передать значение 1-ого столбца строки а котоую сделан двойной клик. Тоисть:
(http://i.piccy.info/i5/11/17/1011711/Image_11.png)

при клике например на строку с ID 93 - нужно получить 93


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: alexman от Январь 26, 2011, 21:56
QVariant QAbstractItemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) const


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: core от Январь 26, 2011, 22:15
и как привязать к двойному клику на строку?


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: serg_hd от Январь 26, 2011, 23:56
Знаю, что способ весьма костыльный, но лучше не придумал - не нашёл на что можно цеплять event filter, подходящего Role тоже нету (а вообще наверняка есть более "нативный" метод), всё-таки, наверное, лучше чем ничего.
Создаём фильтр событий:
Код
C++ (Qt)
#include <QDebug>
#include <QMouseEvent>
 
class DoubleClickerFilter: public QObject
{
protected:
virtual bool eventFilter(QObject* obj, QEvent* evt)
{
 if (evt->type() == QEvent::MouseButtonDblClick)
 {
  qDebug() << obj->property("id");
 }
 return false;
}
};
 

Для каждой ячейки вьюхи ставим виджет лейбла - он растянется на всю ячейку и не будет перекрывать содержимое - для того, чтобы принимать события двойного клика (или просто QWidget, но с ним не пробовал):
Код
C++ (Qt)
DoubleClicksFilter* filter = new DoubleClicksFilter;
QLabel* lbl = new QLabel;
lbl->setProperty("id", 101); //тут подставлять реальный id, предназначенный для каждой строки
lbl->installEventFilter(filter);
viewTable->setIndexWidget(modelTable->index(0, 0), lbl); //в этом примере только для ячейки с координатами 0:0
 

Заполнять конечно в цикле - с этим никаких проблем не будет.


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: Fat-Zer от Январь 27, 2011, 03:19
сигнал QAbstractItemView:
void   doubleClicked ( const QModelIndex & index )
Не оно?


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: serg_hd от Январь 27, 2011, 03:31
сигнал QAbstractItemView:
void   doubleClicked ( const QModelIndex & index )
Не оно?
да, оч. удачный сигнал. Перед использованием можно создать ассоциативный массив номер_строки=id, затем методом QModelIndex::row() определять номер, этим и получая id. Действительно удобно, а я тупанул, сигналы забыл у представления глянуть ;D Хотя в более оптимальном решении даже не сомневался


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: core от Январь 27, 2011, 03:49
как раз только-что просматривал слоты и увидел doublecliicked. Но всеравно спасибо за помощь.


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: core от Январь 27, 2011, 16:37
Двойной клик оказался вовсе не проблемой. Но как получить даные с первого столбца? QTreeview нет item за координатами. Получается у меня есть строка, на которую нажали, но столбцы определяются отдельно. ВАриат асоциативного масива не подходит, так как данны после добавления фильтруются (ето предназначение класа) и сортируются. Тоисть после обработки строки не будут отвечат ИД. Нужен вариант определения ID в момент двойного клика


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: Kolobok от Январь 27, 2011, 16:56
QModelIndex QModelIndex::sibling ( int row, int column ) const

Чтение документации сильно облегчает жизнь.


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: shirushizo от Январь 27, 2011, 17:58
Двойной клик оказался вовсе не проблемой. Но как получить даные с первого столбца? QTreeview нет item за координатами. Получается у меня есть строка, на которую нажали, но столбцы определяются отдельно. ВАриат асоциативного масива не подходит, так как данны после добавления фильтруются (ето предназначение класа) и сортируются. Тоисть после обработки строки не будут отвечат ИД. Нужен вариант определения ID в момент двойного клика
1.Если у вас QTreeView почему в первом посте таблица?
2.Текст модели неплохо бы показать.
3. Если древовидная модель реализована правильно, то
Код:
connect(view,SIGNAL(doubleClicked(QModelIndex)),SLOT(onClick(QModelIndex)))
...
void Widget::onClick(const QModelIndex &index)
{
  qDebug()<<model->data(index.parent().child(index.row(),0));
}


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: core от Январь 27, 2011, 18:37
Цитировать
QAbstractItemModel* MainWindow::createRecordModel(QObject *parent){
    QStandardItemModel *model = new QStandardItemModel(0, 4, parent);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("windows-1251"));
    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, ("Назва"));
    model->setHeaderData(2, Qt::Horizontal, ("Виконавець"));
    model->setHeaderData(3, Qt::Horizontal, ("Альбом"));
    int size=ui->tableWidget->rowCount();
    for (int i=size-1;i>=0;i--){
          addRecord(model,ui->tableWidget->item(i,0)->text(),ui->tableWidget->item(i,1)->text(),
            ui->tableWidget->item(i,2)->text(),ui->tableWidget->item(i,3)->text());
    }

    return model;
}

QTreeView чтоб показать данные.
потом создаю QTreeView proxyView;
proxyModel = new QSortFilterProxyModel;
proxyModel->setSourceModel(model);
proxyView->setModel(proxyModel);


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: core от Январь 27, 2011, 19:38
Спасибо Kolobok

proxyView->currentIndex().sibling(proxyView->currentIndex().row(),0).data().toString();
и все отлично работает.


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: core от Январь 27, 2011, 23:10
Вообщем остался самый нубский вопрос...Как отправить ето номер назад на главную форму? Тоисть...есть MainWindow. С него запускается етот виджет, о ктором шла речь.

Код:
WideSearch* wWideSearch=new WideSearch;
 wWideSearch->setSourceModel (createRecordModel(wWideSearch));
wWideSearch->show();
как теперь передать найденній ID назад в MainWindow, который уже открыт? Пример если можно. Спасибо


Название: Re: QAbstractItemModel : клик на текущей строке
Отправлено: core от Январь 28, 2011, 02:15
Есть у кого идеи как передать етот ID на главную форму?