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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отцентровать Checkbox делегата в ячейке QTableView  (Прочитано 5897 раз)
crazymonkey
Гость
« : Май 27, 2015, 16:37 »

Добрый день.
Есть QCheckBox с моделью с делегатом.
Делегат описан следующим образом:

Код:
class BoxChannelItemDelegate : public QStyledItemDelegate{
    Q_OBJECT
public:
    explicit BoxChannelItemDelegate(QObject *parent = 0) : QStyledItemDelegate(parent){}

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

        QStyleOptionViewItemV4 viewItemOption(option);
        if (index.column() == 0) {
            const int textMargin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
            QRect newRect = QStyle::alignedRect(option.direction, Qt::AlignCenter,
                                                QSize(option.decorationSize.width() + 5,option.decorationSize.height()),
                                                QRect(option.rect.x() + textMargin, option.rect.y(),
                                                      option.rect.width() - (2 * textMargin), option.rect.height()));
            viewItemOption.rect = newRect;
        }
        QStyledItemDelegate::paint(painter, viewItemOption, index);
    }

    virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{
        qDebug() << Q_FUNC_INFO;
        qDebug() << index.data();
        if (index.column() == 0){
            QCheckBox* checkbox = new QCheckBox(parent);

            checkbox->setChecked(index.data().toBool());
            return checkbox;
        }
        return parent;
    }

    virtual void setEditorData(QWidget *editor, const QModelIndex &index) const{
        if (index.column() == 0){
            QCheckBox* checkbox = qobject_cast<QCheckBox*>(editor);
            checkbox->setChecked(index.data().toBool());
        }
    }

    virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const{
        qDebug() << Q_FUNC_INFO;
        if (index.column() == 0){
            QCheckBox *checkbox = qobject_cast<QCheckBox*>(editor);
            model->setData(index,checkbox->isChecked());
        }
    }

    virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const{
        qDebug() << Q_FUNC_INFO;
        editor->setGeometry(option.rect);
    }

};


при этом в модели флаги для нулевого столбца указаны как Checkable
Код:
        if(index.column() == 0) {
            return QAbstractTableModel::flags(index) | Qt::ItemIsUserCheckable | Qt::ItemIsEditable;
        }

И вроде всё хорошо. Он отображает checkbox в ячейке.
Но при нажатии на ячейку для редактировани, виджет checkboх создаётся прижатым к правому краю.
Как бы его отцентровать?

Отображение

Редактирование


Записан
crazymonkey
Гость
« Ответ #1 : Май 27, 2015, 17:13 »

Если кто ещё искать будет, вот ответ:
Как вариант создать -
Код:
class CenterAlignedCheckbox: public QWidget{
    Q_OBJECT
    QCheckBox* checkbox;
public:
    CenterAlignedCheckbox(QWidget* parent):QWidget(parent){
        checkbox = new QCheckBox(this);
        QHBoxLayout* layout = new QHBoxLayout(this);
        layout->addWidget(checkbox,0,Qt::AlignCenter);
    }
    bool isChecked(){return checkbox->isChecked();}
    void setChecked(bool value){checkbox->setChecked(value);}
};

И использовать в качестве editora в делегате именно его Подмигивающий
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #2 : Май 27, 2015, 17:42 »

Если кто ещё искать будет, вот ответ:
Как вариант создать -
Код:
class CenterAlignedCheckbox: public QWidget{
    Q_OBJECT
    QCheckBox* checkbox;
public:
    CenterAlignedCheckbox(QWidget* parent):QWidget(parent){
        checkbox = new QCheckBox(this);
        QHBoxLayout* layout = new QHBoxLayout(this);
        layout->addWidget(checkbox,0,Qt::AlignCenter);
    }
    bool isChecked(){return checkbox->isChecked();}
    void setChecked(bool value){checkbox->setChecked(value);}
};

И использовать в качестве editora в делегате именно его Подмигивающий

В общем, без создания новой сущности будет так:
Код
C++ (Qt)
 
   virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{
       if (index.column() == 0){
           QCheckBox* checkbox = new QCheckBox();
           checkbox->setChecked(index.data().toBool());
 
           QWidget * editor = new QWidget(parent);
           QHBoxLayout * layout = new QHBoxLayout();
           layout->addWidget(checkbox,0,Qt::AlignCenter);
           editor->setLayout(layout);
           return editor;
       }
       return parent;
 
Записан

Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Май 28, 2015, 10:05 »

Если вам нужен только чекбокс, может нет смысла писать для этой колонки делегат? И просто возвращать AlignRole соответствующий в data().
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Май 28, 2015, 10:35 »

Если вам нужен только чекбокс, может нет смысла писать для этой колонки делегат? И просто возвращать AlignRole соответствующий в data().
AlignRole применима к расположению текста, а не check-mark-а  Грустный
Записан

Qt 5.11/4.8.7 (X11/Win)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #5 : Май 28, 2015, 13:39 »

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


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