Russian Qt Forum

Qt => Базы данных => Тема начата: trenkinan от Май 12, 2010, 18:26



Название: Удаление строки и currentSelection
Отправлено: trenkinan от Май 12, 2010, 18:26
Столкнулся с такой проблемой: Талица, контекстное меню, в нем есть пункт удалить, в обработчике к нему пишу:
Код
C++ (Qt)
model1->setEditStrategy(QSqlTableModel::OnManualSubmit);
   QModelIndexList currentSelection = ui->mytable->selectionModel()->selectedIndexes();
  // model1->removeRow(currentSelection.count());//так как не то пока удаляет
   qDebug()<<currentSelection;
   qDebug()<<currentSelection.count();
Вот что выдает мне дебаг:
Код:
(QModelIndex(11,1,0x52d8160,QSortFilterProxyModel(0x52d7c68) )  )  
1
В таблице 12 строк, т.е. как я понимаю modelindex работает верно и косячит count(). Причем единица выдается всегда, где бы не щелкнул. Что такое может быть?


Название: Re: Удаление строки и currentSelection
Отправлено: kibsoft от Май 12, 2010, 19:02
А я не понял модель собственная?

Я вообще делал удаление так(своя модель):
1) В классе модели есть QList, который представляет собой выводимые данные.
2) В этом QList при выделении нескольких строк во View я помечал нужные индексы какой-нибудь особой строкой QString removeMark="RemItem"; например.
3) А потом просто делал QList::removeAll("RemItem");


Название: Re: Удаление строки и currentSelection
Отправлено: crossly от Май 12, 2010, 19:16
Код:
foreach(QModelIndex i,view->selectedIndexes())
       model->removeRow(i.row());


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 12, 2010, 19:18
Интересное конечно предложение, спасибо. Но я бы хотел сделать по аналогии с SQL Browser-ом. т.е. нечто вроде
Код
C++ (Qt)
model1->removeRow(currentSelection.at(currentSelection.count()).row());
model1->submitAll();
Но пока так не получается, в общем я пока не хочу реализовывать удаление нескольких записей сразу, достаточно будет реализовать удаление одной, выделенной правой мышкой...


Название: Re: Удаление строки и currentSelection
Отправлено: crossly от Май 12, 2010, 19:21
ааа...  ну дык и возьмите код с sqlbrowser.... в чем проблема то??


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 12, 2010, 19:22
на
Код
C++ (Qt)
foreach(QModelIndex i,view.selectedIndexes())
говорит
Код:
 error: within this context
Можно пояснить, что здесь что.


Название: Re: Удаление строки и currentSelection
Отправлено: kibsoft от Май 12, 2010, 19:24
Наверное view не доступен тут. Где он объявлен?


Название: Re: Удаление строки и currentSelection
Отправлено: crossly от Май 12, 2010, 19:25
как объявлен view?? и кстати да ... нужно ....count()-1


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 12, 2010, 19:28
Вот по аналогии с примером из браузера:
Код
C++ (Qt)
model1->setEditStrategy(QSqlTableModel::OnRowChange);
   QModelIndexList currentSelection = ui->mytable->selectionModel()->selectedIndexes();
   for (int i = 0; i < currentSelection.count(); ++i) {
       if (currentSelection.at(i).column() != 0)
           continue;
       model1->removeRow(currentSelection.at(i).row());
   }
 
   model1->submitAll();
   model1->setEditStrategy(QSqlTableModel::OnRowChange);
 
 
Сносит сразу по 2 записи и меняет странным образом содержимое таблицы. Созданные в данные момент записи удалять не может


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 12, 2010, 19:29
Код
C++ (Qt)
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
QTableView view;


Название: Re: Удаление строки и currentSelection
Отправлено: crossly от Май 12, 2010, 19:34
чет я не пойму
Код:
QTableView view;
а что у вас
Код:
ui->mytable
??


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 12, 2010, 19:51
Извиняюсь, моя таблица создавалась в дизайнере, поэтому к не я обращаюсь:
Код
C++ (Qt)
ui->mytable->


Название: Re: Удаление строки и currentSelection
Отправлено: kibsoft от Май 12, 2010, 19:52
ммм..зачем view тогда? ))


Название: Re: Удаление строки и currentSelection
Отправлено: crossly от Май 12, 2010, 19:54
если вам нужно удалить только одну запись (я так понимаю последнюю из выделения), то
Код:
model1->setEditStrategy(QSqlTableModel::OnManualSubmitChange);
    QModelIndexList currentSelection = ui->mytable->selectionModel()->selectedIndexes();
    model1->removeRow(currentSelection.at(currentSelection.count()-1).row());
    model1->submitAll();
    model1->setEditStrategy(QSqlTableModel::OnRowChange);


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 12, 2010, 19:56
Виноват, не использовалась эта view, пересмотрел код, понял почему у меня setAlternateColor не работал, но факт остается, теперь имею такой обработчик меню удалить:
Код
C++ (Qt)
void MainWindow::deleterow_slot()
{
   model1->setEditStrategy(QSqlTableModel::OnRowChange);
   QModelIndexList currentSelection = ui->mytable->selectionModel()->selectedIndexes();
   for (int i = 0; i < currentSelection.count()-1; ++i) {
       if (currentSelection.at(i).column() != 0)
           continue;
       model1->removeRow(currentSelection.at(i).row());
   }
 
   model1->submitAll();
   model1->setEditStrategy(QSqlTableModel::OnRowChange);
 
 
   qDebug()<<currentSelection;
   qDebug()<<currentSelection.count();
}

Свежесозданные в момент работы программы записи удаляет, а вот остальные ни в какую


Название: Re: Удаление строки и currentSelection
Отправлено: kibsoft от Май 12, 2010, 20:03
Я так и не понял что именно надо сделать, все записи выделенные удалить или нет..
Если только одну выделенную, то можно так:
Код:
QModelIndex currentIndex=ui->mytable->selectionModel()->currentIndex();
model1->removeRow(currentIndex.row());
model1->submitAll();


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 12, 2010, 22:52
Сделал так, теперь  все работает, Спасибо , но если неверно заполнять форму, то при попытке удаления чего либо возникает критическая ошибка


Название: Re: Удаление строки и currentSelection
Отправлено: lit-uriy от Май 12, 2010, 23:43
trenkinan, вроде бы тебе в другой теме я давал фрагменты кода вставки/удаления строк.


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 12, 2010, 23:50
Да, верно, давал. Все работает, но повторюсь, тлько что заполненные строки, и строки, заполненные не до конца не удаляются( так же и в SQL browser-e). Пока не критично, но буду смотреть. Обнаружил странный глюк, уже второй раз такое с проектом: в какой-то момент часть вносимых изменений перестает обрабатываться, т.е. например, я выбираю другую таблицу  коде а программа запускается с выбором прежней, исправляется переписыванием проекта с нуля, ни у кого такого не было?Вроде как виноват ui файл, пока правда не пойму что в нем конкретно, но именно при его перенесении в новый проект на нем начинаются старые глюки... 


Название: Re: Удаление строки и currentSelection
Отправлено: lit-uriy от Май 13, 2010, 01:36
у тебя какая версия Qt?


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 15, 2010, 11:12
QT 4.5 и еще при первом запуске проекта, если попытаться отсортировать или удалить что-то вылетает критическая ошибка. При повторном запуске программы вроде как пропадает такое поведение. Но вот если форму заполнять не до конца удалить ее нельзя будет, это я так понимаю проблема самой библиотеки


Название: Re: Удаление строки и currentSelection
Отправлено: crossly от Май 15, 2010, 12:01
давай компилябельный код... разберемся....


Название: Re: Удаление строки и currentSelection
Отправлено: trenkinan от Май 15, 2010, 12:19
вот пример