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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Новая проблема QHeaderView наследование и слоты  (Прочитано 7189 раз)
Денис
Гость
« : Октябрь 08, 2014, 14:38 »

В очередной раз обращаюсь к сообществу ... Создал таблицу основную на QAbstractTableModel ...
А теперь пытаюсь создать на основе этой модели таблицу с редактируемыми данными, но ничего не получается, не могу найти и переопределить слот изменения объекта, а также на работает выдача объектов в виде QTableWidgetItem ?

Код:
bool BaseClientTable::setData(int row, int column, QTableWidgetItem &item)
{
    array[BaseClientTable::column * row + column] = item;
}

QVariant BaseClientTable::data(const QModelIndex& index, int role) const
{
    if(role == HierarchicalHeaderView::HorizontalHeaderDataRole)
    {
        QVariant var;
        var.setValue((QObject*)&horizontalHeaderModel);
        return var;
    }
    if(role == HierarchicalHeaderView::VerticalHeaderDataRole)
    {
        QVariant var;
        var.setValue((QObject*)&verticalHeaderModel);
        return var;
    }
    if(role == Qt::DisplayRole && index.isValid())
    {
        return array[BaseClientTable::column*index.row() + index.column()];
    }
    return QVariant();
}

Выдает ошибку:
ошибка: could not convert '*(((QTableWidgetItem*)((const BaseClientTable*)this)->BaseClientTable::array) + ((sizetype)(((unsigned int)((((int)((const BaseClientTable*)this)->BaseClientTable::column) * (& index)->QModelIndex::row()) + (& index)->QModelIndex::column())) * 24u)))' from 'QTableWidgetItem' to 'QVariant'
         return array[BaseClientTable::column*index.row() + index.column()];


 Если же в качестве объекта выдавать QString, то все работает, так как QVariant может хранить данный класс, а вот конвертация в QTableWidgetItem невозможна (
« Последнее редактирование: Октябрь 11, 2014, 13:59 от Денис » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Октябрь 08, 2014, 15:19 »

Потому что, объект QTableWidgetItem работает только с QTableWidget и наоборот.
Для QAbstractTableModel вам придется самому добавить методы для работы с QTableWidgetItem.
Записан

Денис
Гость
« Ответ #2 : Октябрь 08, 2014, 15:23 »

Ну хорошо, а как тогда в моей модели таблицы сделать чтобы ячейка была редактируемой ? Есть пример ?
Данные таблицы для отображения выдает эта функция data(...), а она определена только так, я могу конечно возвращать текст объекта QTableWidgetItem, то как мне сделать чтобы приходило событие ио двойном щелчке и ячейка становилась редактируемой ?
« Последнее редактирование: Октябрь 08, 2014, 15:26 от Денис » Записан
Денис
Гость
« Ответ #3 : Октябрь 08, 2014, 16:30 »

Подсмотрел пример http://asinenko.com/qabstractitemmodel-rtti/

И получил такой код:
Код:
class BaseClientTable: public QAbstractTableModel
{
    Q_OBJECT

public:
    BaseClientTable(int row, int column, int language, QObject* parent = 0);

    int rowCount(const QModelIndex& /*parent*/) const;
    int columnCount(const QModelIndex& /*parent*/) const;

    QVariant data(const QModelIndex& index, int role) const;
    bool setData(int row, int column, QString item);
    void changeHeader(unsigned short);

private:
    QStandardItemModel horizontalHeaderModel;
    QStandardItemModel verticalHeaderModel;

    QString *str;
    int row;
    int column;
    int language;

    void init();
    void fillHeaderHorizontal(QStandardItemModel& headerModel);
};

class BaseClientDelegate : public QItemDelegate
{
public:
    BaseClientDelegate();
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    void setEditorData(QWidget *editor, const QModelIndex &index) const;
    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
};

Далее сделал так:
Код:
    ui->tableView->setItemDelegate(new BaseClientDelegate);
    ui->tableView->setModel(baseClient);
    ui->tableView->show();

Но связывания не произошло и не вызываются редакторы виджетов, может необходимо connect где-то сделать ?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Октябрь 08, 2014, 17:17 »

Советую почитать документацию про модели и делегаты. Есть в разных учебниках по Qt на русском. Сразу станет все понятно.
Потратьте пару часов.
Записан
Денис
Гость
« Ответ #5 : Октябрь 08, 2014, 22:52 »

Хорошо, с этим как-то разобрался, но появилась новая проблема:
Код:
    QString fileName = QFileDialog::getOpenFileName(this,tr("Open File"),QDir::currentPath(),"Text File (*.csv)");

    if(QFile(fileName).exists())
    {
        ui->tableClient->close();
        baseClient->openFile(fileName);
        ui->tableClient->show();
    }
    else
        QMessageBox::information(this,tr("Ошибка"),"Файла не существует, проверьте имя файла !");
baseClient - это модель таблицы, там определена функция открытия файла, но вот незадача ... после обновления количества строк до меньшего, у меня остаются лишние строки
Как бы мне сообщить tableClient-QTableView что количество строк уменьшилось, чтобы он перерисовал табличку 7
Записан
Wulff007
Гость
« Ответ #6 : Октябрь 09, 2014, 12:11 »

Покажи весь код, по хидеру ничего не определишь. Что бы сделать редактируемые ячейки нужно переопределить у модели flags(читай доки по QAbstractItemModel)
Записан
Денис
Гость
« Ответ #7 : Октябрь 09, 2014, 23:33 »

Покажи весь код, по хидеру ничего не определишь. Что бы сделать редактируемые ячейки нужно переопределить у модели flags(читай доки по QAbstractItemModel)

Разобрался уже, после редактирования количеста строк необходимо было испустить сигнал:
Код:
emit layoutChanged();

Он ловится QTableView и он запрашивает новое количествог строк у модели и перерисовывается по ним ...
Записан
Денис
Гость
« Ответ #8 : Октябрь 10, 2014, 21:00 »

Возник новый вопрос по таблице, а как сделать что бы выделялся заголовок столбцов, то есть по нему щелкаещь а он выделяется, из-за этого у меня не делается сортировка ?
Записан
Денис
Гость
« Ответ #9 : Октябрь 10, 2014, 21:13 »

Так с этим опять разобрался, не включалась так как я включил сортировку, но ее нужно же как-то определять ?
« Последнее редактирование: Октябрь 10, 2014, 21:27 от Денис » Записан
Денис
Гость
« Ответ #10 : Октябрь 10, 2014, 22:18 »

С сортировкой разобрался включив посредника QSortFilterProxyModel, и она происходит но есть проблема, не отображаются стрелки сортировки ? и посредник оставляет нумерацию строк в результате получается следующее:



Как это побороть без отключения отображения нумерации строк ?
Записан
Денис
Гость
« Ответ #11 : Октябрь 11, 2014, 13:57 »

Кажется понял у меня используется иерархическая модель ходера, и видимо он по сигналу не перерисовывает заголовок колонки и не отображает стрелку, как бы мне перехватить и отрисоавть заголовок самому ?
Записан
Денис
Гость
« Ответ #12 : Октябрь 11, 2014, 14:54 »

Ладно, расширю описание проблемы ... Проблема в следующем:
Прикрутил к QTableView иерархический хидер, а также с помощью класса QSortFilterProxyModel промежуточной модели организовал сортировку:
Код:
    proxyModel.setSourceModel(baseClient);
    ui->tableClient->setItemDelegate(new BaseClientDelegate);
    ui->tableClient->setModel(&proxyModel);

, но проблема в том что сортировка то происходит но не отображаются стрелки сортировки:



и почему-то перепутана нумерация строк, я так понимаю в последнем щалит промежуточная модель QSortFilterProxyModel ?
А вот с первым уже замучался, включил отображение сортировки где только возможно но стрелки сортировки так и не появились ? Делал включение в QHeaderView:
Код:
hierarHeader->setSortIndicatorShown(true);

, также включал в таблице:
Код:
ui->tableClient->setSortingEnabled(true);
но отображения стрелок в таблице не происходит, может модель прорисовки необходимо описать или укажите плз в каком направлении копать ?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #13 : Октябрь 11, 2014, 19:49 »

проблема явно в кастомном иерархическом компоненте, покопайся в его исходниках

а номера видимо отсортировались вместе с данными Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Денис
Гость
« Ответ #14 : Октябрь 11, 2014, 20:10 »

проблема явно в кастомном иерархическом компоненте, покопайся в его исходниках

а номера видимо отсортировались вместе с данными Улыбающийся

Уже покопался, там почемуто не обрабатывалось событие sortIndicatorChanged(int,Qt::SortOrder). Добавил вот такой кусок, работает но почемуто появляются стрелки для всех колонок, ходя в дебаге явно виден индекс нужной колонки :

Код:
HierarchicalHeaderView::HierarchicalHeaderView(Qt::Orientation orientation, QWidget *parent)
    :QHeaderView(orientation, parent), _pd(new private_data())
{
    connect(this, SIGNAL(sectionResized(int, int, int)), this, SLOT(on_sectionResized(int)));
    connect(this, SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(on_sortIndicatorChanged(int, Qt::SortOrder)));
}

HierarchicalHeaderView::~HierarchicalHeaderView()
{
    delete _pd;
}

void HierarchicalHeaderView::on_sortIndicatorChanged(int logicalIndex, Qt::SortOrder state)
{
    if(state)
        sorrt = SortUp;
    else
        sorrt = SortDown;

    paintSection(new QPainter(), this->rect(), logicalIndex);
}

Продолжаю копать ...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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