crossplatform.ru

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

> setindexwidget у QTableView, setindexwidget у QTableView
bikineev
  опции профиля:
сообщение 11.12.2011, 20:49
Сообщение #1


Новичок


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

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




Репутация:   0  


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


Студент
*

Группа: Участник
Сообщений: 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
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




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