crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> setindexwidget у QTableView, setindexwidget у QTableView
bikineev
  опции профиля:
сообщение 11.12.2011, 20:49
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 18.11.2011
Пользователь №: 3009

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте. Помещаю в QTableView с помощью setindexwidget кнопки, но когда начинаю редактировать какую-либо ячейку, кнопки исчезают. Как решить данную проблему.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BlueIceScream
  опции профиля:
сообщение 11.12.2011, 21:14
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 21.11.2011
Из: Республика Дагестан
Пользователь №: 3016

Спасибо сказали: 18 раз(а)




Репутация:   3  


То что вы вставили виджеты в ячейку вовсе не означает что делегат при редактировании о них что то знает. Он получает размер прямоугольника и заполняет ячейку виджетом для редактирования. Ваши виджеты просто скроются. Решение одно - делать собственный делегат и реализовать виджет редактирования как вы хотите.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bikineev
  опции профиля:
сообщение 12.12.2011, 7:14
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 18.11.2011
Пользователь №: 3009

Спасибо сказали: 0 раз(а)




Репутация:   0  


Возможно ли сделать делегат, чтобы кнопки все время были видны, а не только когда нажмешь на ячейку?
Что, в таком случае, для этого нужно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 12.12.2011, 14:24
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(bikineev @ 12.12.2011, 8:14) *
Возможно ли сделать делегат, чтобы кнопки все время были видны, а не только когда нажмешь на ячейку?

Да
Цитата(bikineev @ 12.12.2011, 8:14) *
Что, в таком случае, для этого нужно?

создать свой делегат/делегаты для представления
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BlueIceScream
  опции профиля:
сообщение 12.12.2011, 14:35
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 21.11.2011
Из: Республика Дагестан
Пользователь №: 3016

Спасибо сказали: 18 раз(а)




Репутация:   3  


Вам нужно переопределить стандартный делегат который используется для прорисовки.

1) Наследуете QStyledItemDelegate.
2) Переопределяете его методы

createEditor, paint, setEditorData, setModelData, sizeHint, updateEditorGeometry

3) Устанавливаете делегат для нужного столбца или строки. Если необходимо отображение делегата только для специальных типов в ячейках используете QItemEditorFactory и QEditorCreaterBase.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
bikineev
  опции профиля:
сообщение 13.12.2011, 0:29
Сообщение #6


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 18.11.2011
Пользователь №: 3009

Спасибо сказали: 0 раз(а)




Репутация:   0  


Для того чтобы кнопки были видны всегда нужно переопределять метод paint? Каким образом можно сделать это?


Сейчас попробовал таким образом
class PushButtonDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    PushButtonDelegate(QWidget* pobj) : QItemDelegate(pobj), _state (QStyle::State_Enabled){}
    QWidget *createEditor(QWidget *parent,
                          const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
    {
        return new QPushButton(parent);
    }
    void paint(QPainter *painter,
               const QStyleOptionViewItem &option,
               const QModelIndex &index) const
    {
        const QStandardItemModel* model =
                static_cast<const QStandardItemModel*>(index.model());
        QStandardItem* item = model->item(index.row());

        QString text = item->text();
        QRect rect = option.rect;

        QRect textRect( rect);
        textRect.setHeight( 30);
        painter->drawText(textRect,text);

        QRect buttonRect( rect);
        buttonRect.setY(textRect.y()+ 35);
        buttonRect.setHeight( 30);
        QStyleOptionButton button;
        button.rect = buttonRect;
        button.text = text;
        button.state = _state | QStyle::State_Enabled;

        QApplication::style()->drawControl
                (QStyle::CE_PushButton, &button, painter);
    }

    QSize sizeHint(const QStyleOptionViewItem &/*option*/,
                   const QModelIndex &/*index*/) const
    {
        //hard coding size for test purpose,
        //actual size hint can be calculated from option param
        return QSize(800,70);
    }
    bool editorEvent(QEvent *event,
                     QAbstractItemModel *model,
                     const QStyleOptionViewItem &option,
                     const QModelIndex &index)
    {
        if( event->type() == QEvent::MouseButtonPress ||
            event->type() == QEvent::MouseButtonRelease ) {
        } else {
            //ignoring other mouse event and reseting button's state
            _state = QStyle::State_Raised;
            return true;
        }

        QRect buttonRect( option.rect);
        buttonRect.setY(option.rect.y()+ 35);
        buttonRect.setHeight( 30);

        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
        if( !buttonRect.contains( mouseEvent->pos()) ) {
            _state = QStyle::State_Raised;
            return true;
        }

        if( event->type() == QEvent::MouseButtonPress) {
            _state = QStyle::State_Sunken;
        } else if( event->type() == QEvent::MouseButtonRelease) {
            _state = QStyle::State_Raised;
            emit buttonClicked( index);
        }
        return true;
    }
signals:
    void buttonClicked(const QModelIndex &index);
private:
    QStyle::State  _state;

};

на этапе выполнения получаю SIGSEGV
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BlueIceScream
  опции профиля:
сообщение 13.12.2011, 17:11
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 21.11.2011
Из: Республика Дагестан
Пользователь №: 3016

Спасибо сказали: 18 раз(а)




Репутация:   3  


Я не умею программировать, поэтому набросала примерный код, чтобы была ясна основная идея. Вам лучше реализовать все по стандартам Qt. Виртуальные методы для редактирования я переопределять не стала. Посмотрев код вы поймете как это сделать.

#ifndef ____IX2_DELEGATE_H
#define ____IX2_DELEGATE_H

#include <QStyledItemDelegate>

class ix2Delegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit ix2Delegate(QObject *parent = 0);

    virtual void paint(QPainter *painter,
                       const QStyleOptionViewItem &option,
                       const QModelIndex &index) const;

    virtual QSize sizeHint(const QStyleOptionViewItem &option,
                           const QModelIndex &index) const;

    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index);

private:
    QStyle::State  btnState;
};

#endif // ____IX2_DELEGATE_H



#include "ix2delegate.h"
#include <QStandardItemModel>
#include <QPainter>
#include <QStyleOptionButton>
#include <QApplication>
#include <QMouseEvent>

const int margin = 10;

ix2Delegate::ix2Delegate(QObject *parent) :
    QStyledItemDelegate(parent)
{
    btnState =  QStyle::State_Enabled;
}

void ix2Delegate::paint(QPainter *painter,
                   const QStyleOptionViewItem &option,
                   const QModelIndex &index) const
{

    QStyleOptionViewItemV4 optV4(option);
    this->initStyleOption(&optV4,index);

    QString modelText = optV4.text;
    QString buttonText("Test Text");

    QFontMetrics fm (optV4.fontMetrics);

    QRect txtRect(optV4.rect.x(),optV4.rect.y(),fm.width(modelText)+margin,optV4.rect.height());
    QRect btnRect(optV4.rect.x()+txtRect.width(),optV4.rect.y(),fm.width(buttonText)+margin,optV4.rect.height());

    QStyleOptionButton btnOpt;
    btnOpt.rect = btnRect;
    btnOpt.text = buttonText;
    btnOpt.state = btnState | QStyle::State_Enabled;

    QApplication::style()->drawControl(QStyle::CE_PushButton, &btnOpt, painter);
    QApplication::style()->drawItemText(painter,txtRect,Qt::AlignLeft|Qt::AlignVCenter,optV4.palette,true,modelText);
}

QSize ix2Delegate::sizeHint(const QStyleOptionViewItem &option,
                       const QModelIndex &index) const
{
    QStyleOptionViewItemV4 optV4(option);
    this->initStyleOption(&optV4,index);

    QFontMetrics fm (optV4.fontMetrics);

    return QSize(fm.width(optV4.text)+fm.width("Test Text")+20,fm.height()+10);
}

bool ix2Delegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
    if( event->type() == QEvent::MouseButtonPress ||
        event->type() == QEvent::MouseButtonRelease ) {
    } else {
         btnState = QStyle::State_Raised;
        return true;
    }

    QStyleOptionViewItemV4 optV4(option);
    this->initStyleOption(&optV4,index);

    QFontMetrics fm (optV4.fontMetrics);

    QRect actRect(optV4.rect.x()+fm.width(optV4.text)+margin,
                  optV4.rect.y(),
                  margin+fm.width("Test Text"),
                  optV4.rect.height());

    QMouseEvent* mouseEvent = dynamic_cast<QMouseEvent*>(event);
    if( !actRect.contains( mouseEvent->pos()) ) {
        btnState = QStyle::State_Raised;
        return true;
    }

    if( event->type() == QEvent::MouseButtonPress) {            
        btnState = QStyle::State_Sunken;
    } else if( event->type() == QEvent::MouseButtonRelease) {
        btnState = QStyle::State_Raised;
    }    
    return true;
}





Рабочий вариант программы по ссылке.
Прикрепленные файлы
Прикрепленный файл  ix2Delegate.tar.gz ( 1,7 килобайт ) Кол-во скачиваний: 424
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.11.2024, 4:29