Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: linuxoid от Октябрь 16, 2007, 16:25



Название: Срочно помогите с таблицей!
Отправлено: linuxoid от Октябрь 16, 2007, 16:25
как считать выделенные ячейки в QTabeView и засунуть их в переменную??? ???!!! использую и QSqlTableModel и есть своя модель!Помогите пожалуйста срочно, я уже всё перепробовал!то ли у меня QT глючит, то ли я уже глючу)заранее спасибо!
QT 4.2.3


Название: Re: Срочно помогите с таблицей!
Отправлено: ритт от Октябрь 16, 2007, 16:45
копай QItemSelectionModel

/убей - не помню была ли данная модель в 4.2.х, но думаю, что да/


Название: Re: Срочно помогите с таблицей!
Отправлено: Kainit от Октябрь 16, 2007, 16:48
Код:
QString TMyMegaTableView::GetAllSelectedInOneString()
{
    QModelIndexList selected = selectedIndexes();

    QString result;

    for(int i=0; i<selected .count(); i++)
        result += selected.at(i).model()->data(selected.at(i), Qt::DisplayRole));

    return result;
}

Можно придумать полаконичнее, но так тоже должно работать. Но самое главное что QItemSelectionModel тут совершенно ни к селу.


Название: Re: Срочно помогите с таблицей!
Отправлено: pastor от Октябрь 16, 2007, 17:02
QItemSelectionModel в тему также, так как selectedIndexes работает через этот класс



Название: Re: Срочно помогите с таблицей!
Отправлено: Kainit от Октябрь 16, 2007, 17:13
Я в том смысле что копать лучше с QAbstractItemView... а что selectedIndexes через QItemSelectionModel работают, то понятно, но для понимания MVC надо много времени, а раз уж человеку надо срочно...


Название: Re: Срочно помогите с таблицей!
Отправлено: ритт от Октябрь 16, 2007, 19:38
кайнит (правильно?), дело в том, что я попросту не имею понятия откуда линуксоид собрался читать выделенные ячейки
Цитировать
как считать выделенные ячейки в QTabeView и засунуть их в переменную??? !!! использую и QSqlTableModel и есть своя модель!

если читать их надо из вьюхи, конечно, быстрее воспользоваться функциями-обёртками
если же читать их надо вне вьюхи (из модели или ещё откуда), то других вариантов не вижу, кроме как читать у вьюхи QItemSelectionModel и работать непосредственно с ней


Название: Re: Срочно помогите с таблицей!
Отправлено: linuxoid от Октябрь 17, 2007, 09:47
ПОМОГИТЕ!Выглядит всё так::::

1)        QModelIndexList index = tableView->selectedIndexes();
2)        for(int i=0; i<index.count(); i++)
3)        var = tableView->model()->data(index.at(i));
4)        qDebug() << var.toString();

но проблема в 1 - ой строчке!пишет:

!!! error: ‘virtual QModelIndexList QTableView::selectedIndexes() const’ is protected!!!ъ
срочно помогите пожалуйста!!!Заранее благодарю. :-\


Название: Re: Срочно помогите с таблицей!
Отправлено: Kainit от Октябрь 17, 2007, 10:00
Про срочность можешь уже и не писать.

Есть 2 варианта, правильный и чуть менее.

1. (правильный) метод должен быть методом твоего View (просто наследуешь тупо обычный QTabeView и добавляешь метод)
Код:
QString TMyMegaTableView::GetAllSelectedInOneString()
т.е. просто сделай тупой класс
Код:
class TMyMegaTableView : public QTabeView 
{
public:
    TMyMegaTableView (QWidget *parent);

    QString GetAllSelectedInOneString();
};

TMyMegaTableView (QWidget *parent) : QTreeView(parent){}


2. (чуть менее правильный) тебе всё равно придётся отнаследоваться и тебе надо будет распаблишить метод selectedIndexes(), но это ХАК и за такое бъют по рукам раскалённым стальным прутом.

И надо помнить что есть прямая дырка, а есть попытки почесать пятку через плечо. Прямая и абсолютно законная дырка - наследование.


Название: Re: Срочно помогите с таблицей!
Отправлено: pastor от Октябрь 17, 2007, 10:01
Хм, все верно, этот метод protected. Юзай значит QItemSelectionModel или создавай наследника от QTableView


Название: Re: Срочно помогите с таблицей!
Отправлено: Пантер от Октябрь 17, 2007, 11:30
Я делал так. Все работает замечтательно.   
qtvReferences - вьюха
QItemSelectionModel* qismSelection=qtvReferences->selectionModel();   
QModelIndexList qmilIndexes=qismSelection->selectedIndexes();
for (int i=0; i<qmilIndexes.count(); i++)
{
  if (qmilIndexes.at(i).column()!=0) continue;
// Какое-либо действие
}
В qmilIndexes  попадут все ячейки и в цикле их нужно отсеивать, т.е. я отсеиваю все, которые не в первой колонке.


Название: Re: Срочно помогите с таблицей!
Отправлено: linuxoid от Октябрь 17, 2007, 11:55
спасибо!Вы Человеки с большой буквы!


Название: Re: Срочно помогите с таблицей!
Отправлено: ритт от Октябрь 17, 2007, 12:10
и всё-таки селекшнмодель! :)


Название: Re: Срочно помогите с таблицей!
Отправлено: Kainit от Октябрь 17, 2007, 12:21
Цитировать
и всё-таки селекшнмодель!
Да, похоже что так.

Но программеры троллевские непоследовательны
tableView->selectedIndexes(); - приваченный

tableView->selectionModel()->selectedIndexes(); - публичный

Просто бред...



Название: Re: Срочно помогите с таблицей!
Отправлено: ритт от Октябрь 17, 2007, 12:57
это не бред, это - концепция модель/вью-ппрограммирования троллей
вы ведь не станете называть бредом, допустим, формат тындекс-рсс, раз уже существует формат рсс-атом...или станете? :)

ну и, в конце-концов, всегда можно отправить саггест в трекер и подробно обрисовать ситуацию на удивлённый вопрос дежурного: "а зачем вам публичный селектедИндексез во вьюхе, если он есть в публичной селекшнмодели?"


Название: Re: Срочно помогите с таблицей!
Отправлено: Kainit от Октябрь 17, 2007, 14:25
Насчет ындекс-рсс не скажу а вот если поглядеть исходники, оказывается что всё не совсем так как я полагал и
tableView->selectedIndexes();
tableView->selectionModel()->selectedIndexes();
это разные вещи!

Код:
QModelIndexList QTreeView::selectedIndexes() const
{
    QModelIndexList viewSelected;
    QModelIndexList modelSelected;
    if (selectionModel())
        modelSelected = selectionModel()->selectedIndexes();
    for (int i = 0; i < modelSelected.count(); ++i) {
        // check that neither the parents nor the index is hidden before we add
        QModelIndex index = modelSelected.at(i);
        while (index.isValid() && !isIndexHidden(index))
            index = index.parent();
        if (index.isValid())
            continue;
        viewSelected.append(modelSelected.at(i));
    }
    return viewSelected;
}

О как.

Т.е., пользоваться tableView->selectedIndexes(); гораздо более логично для описанных выше задач, нежели tableView->selectionModel()->selectedIndexes().