Russian Qt Forum
Ноябрь 05, 2024, 22:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QAbstractItemModel : клик на текущей строке  (Прочитано 8925 раз)
core
Гость
« : Январь 26, 2011, 21:24 »

Есть QAbstractItemModel обьект с 5 столбцов и N строк. При клике на строку нужно передать значение 1-ого столбца строки а котоую сделан двойной клик. Тоисть:


при клике например на строку с ID 93 - нужно получить 93
Записан
alexman
Гость
« Ответ #1 : Январь 26, 2011, 21:56 »

QVariant QAbstractItemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
Записан
core
Гость
« Ответ #2 : Январь 26, 2011, 22:15 »

и как привязать к двойному клику на строку?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #3 : Январь 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
 

Заполнять конечно в цикле - с этим никаких проблем не будет.
« Последнее редактирование: Январь 27, 2011, 00:40 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Fat-Zer
Гость
« Ответ #4 : Январь 27, 2011, 03:19 »

сигнал QAbstractItemView:
void   doubleClicked ( const QModelIndex & index )
Не оно?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Январь 27, 2011, 03:31 »

сигнал QAbstractItemView:
void   doubleClicked ( const QModelIndex & index )
Не оно?
да, оч. удачный сигнал. Перед использованием можно создать ассоциативный массив номер_строки=id, затем методом QModelIndex::row() определять номер, этим и получая id. Действительно удобно, а я тупанул, сигналы забыл у представления глянуть Смеющийся Хотя в более оптимальном решении даже не сомневался
Записан

kubuntu/Win7/x64/NetBeans
core
Гость
« Ответ #6 : Январь 27, 2011, 03:49 »

как раз только-что просматривал слоты и увидел doublecliicked. Но всеравно спасибо за помощь.
Записан
core
Гость
« Ответ #7 : Январь 27, 2011, 16:37 »

Двойной клик оказался вовсе не проблемой. Но как получить даные с первого столбца? QTreeview нет item за координатами. Получается у меня есть строка, на которую нажали, но столбцы определяются отдельно. ВАриат асоциативного масива не подходит, так как данны после добавления фильтруются (ето предназначение класа) и сортируются. Тоисть после обработки строки не будут отвечат ИД. Нужен вариант определения ID в момент двойного клика
Записан
Kolobok
Гость
« Ответ #8 : Январь 27, 2011, 16:56 »

QModelIndex QModelIndex::sibling ( int row, int column ) const

Чтение документации сильно облегчает жизнь.
Записан
shirushizo
Гость
« Ответ #9 : Январь 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));
}
Записан
core
Гость
« Ответ #10 : Январь 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);
Записан
core
Гость
« Ответ #11 : Январь 27, 2011, 19:38 »

Спасибо Kolobok

proxyView->currentIndex().sibling(proxyView->currentIndex().row(),0).data().toString();
и все отлично работает.
Записан
core
Гость
« Ответ #12 : Январь 27, 2011, 23:10 »

Вообщем остался самый нубский вопрос...Как отправить ето номер назад на главную форму? Тоисть...есть MainWindow. С него запускается етот виджет, о ктором шла речь.

Код:
WideSearch* wWideSearch=new WideSearch;
 wWideSearch->setSourceModel (createRecordModel(wWideSearch));
wWideSearch->show();
как теперь передать найденній ID назад в MainWindow, который уже открыт? Пример если можно. Спасибо
Записан
core
Гость
« Ответ #13 : Январь 28, 2011, 02:15 »

Есть у кого идеи как передать етот ID на главную форму?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.155 секунд. Запросов: 23.