Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Вставка QPushButton в ячейку QTableWidget, Кастомизация ячейки 
V
    Опции темы
JohanMT
Дата 12.2.2016, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 12.2.2016

Репутация: нет
Всего: нет



Привет всем! Появилась некоторая проблема со вставкой кнопки.
Есть колонка с n-количеством строк. В каждую ячейку этой колонки необходимо вставить кнопку,которая будет отвечать за удаление строки в таблице, но при этом что бы ячейка была редактируемая. Кнопка должна располагаться с правой стороны ячейки (AlignRight), а текст должен располагаться по центру (AlignCenter).
setCellWidget не то делает естественно.

Думал о нескольких решениях проблемы, но не на одну как-то не нашел решения:
1. Создать 4-ую колонку, где будут располагаться эти кнопки в строках. И убрать левую границу ячейки
2. Создать делегат, в который вставить компоновщик, в котором содержаться QLineEdit и QPushButton

Либо если есть предложения, то с удовольствием бы выслушал =) И от примеров бы не отказался.
PM MAIL   Вверх
reider
Дата 12.2.2016, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 18.11.2013

Репутация: нет
Всего: нет



тут делегат нужно использовать однозначно
PM MAIL   Вверх
JohanMT
Дата 12.2.2016, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 12.2.2016

Репутация: нет
Всего: нет



А можешь тогда подсказать какую хотя бы функцию переопределять. Как его вообще реализовать. Псевдо-код может какой нибудь накидать, потому как сколько не пытался реализовать делегат для этих ячеек, что то ничего путного не выходило
PM MAIL   Вверх
reider
Дата 12.2.2016, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 18.11.2013

Репутация: нет
Всего: нет



PM MAIL   Вверх
JohanMT
Дата 12.2.2016, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 12.2.2016

Репутация: нет
Всего: нет



reider, мне кажется что это не совсем то.
Код

    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;
    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;


createEditor - создает виджет для редактирования
setEditorData - устанавливает значение в виджет для редактирования
setModelData - передает в модель то что записали в редакторе

Тут делегат для отображении редактора ячейки. Мне редактор обычный подойдет, мне само отображение в ячейке изменить нужно
PM MAIL   Вверх
math64
Дата 16.2.2016, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Нужно изменить отображение ячейки - void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) и обработку клика мыши по ячейке. Такого метода у делегата нет, нужно делать через eventFilter()

Добавлено через 8 минут и 49 секунд
Можно использовать CheckStateRole - если не используется. При установке флажка строка удаляется. Внешний вид флажка можно поменять.
PM   Вверх
JohanMT
Дата 16.2.2016, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 12.2.2016

Репутация: нет
Всего: нет



math64, да, я уже тут догадался переопределять paint. Стиль он зараза стандартный использует...как мне его заставить мой stylesheet использовать? Вот так переопределил:
Код

void QCommentDelegate::paint(QPainter* APainter, const QStyleOptionViewItem& AOption, const QModelIndex& AIndex) const
{
    QStyleOptionButton mButton;
    QRect mRect = AOption.rect;

    mButton.rect = QRect(mRect.left() + mRect.width() - 35, mRect.top() + 1, 32, 32);
    mButton.icon = QIcon(":/_icon/close.ico");
    mButton.iconSize = QSize(32, 32);
    QApplication::style()->drawControl(QStyle::CE_PushButton, &mButton, APainter);
    QStyledItemDelegate::paint(APainter, AOption, AIndex);
}
 

Это сообщение отредактировал(а) JohanMT - 16.2.2016, 18:46
PM MAIL   Вверх
Amp
Дата 16.2.2016, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Цитата(JohanMT @  16.2.2016,  18:33 Найти цитируемый пост)
как мне его заставить мой stylesheet использовать? Вот так переопределил:

Что у тебя в стилях прописано? Если стили именно для QPushButton (например "QPushButton {background-color: pink}"), то drawControl их проигнорирует, т.к. делегат имеет другой тип. В такой ситуации можно попробовать скопировать стили кнопки в стиль для конкретного item-а у QTableWidget. Например сделать это через псевдоселекторы ::item или через селекторы по какому-нибудь специально выставленному  через setProperty атрибуту. 

Пробовал с помощью styleObject = new QPushButton() в QStyleOption как-то повлиять на QStyleSheetStyle::drawControl, но не вышло.
PM MAIL   Вверх
JohanMT
Дата 17.2.2016, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 12.2.2016

Репутация: нет
Всего: нет



Цитата

Например сделать это через псевдоселекторы ::item

Что-то не выходит у меня. Вот так?
Код

QTableWidget::item
{
    background: rgba(0, 0, 0, 0);    
}

Это я в дизайнере конкретной таблице прописываю. В итоге меняется все item-ы, а кнопка как была серой, так и осталась
PM MAIL   Вверх
Amp
Дата 18.2.2016, 18:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Добрался до отладчика, проверил варианты и просто стилями решить не вышло. Вышло костылями через styleObject.

1. Нужна фейковая невидимая кнопка QPushButton. Я ее создал один раз примерно в том же месте, где и делегат. В качества родителя у кнопки указал tablewidget, а в качестве родительского объекта у делегата - кнопку:

Код

QWidget *fakeWidget = new QPushButton(tableWidget);
fakeWidget->hide();
MyDelegete *delegate = new MyDelegete(fakeWidget);


2. Далее, в paintEvent делегата, сделал следующие вещи:
Код

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QWidget *parentWidget = dynamic_cast<QWidget *>(parent());

    QStyleOptionButton button;
    button.styleObject = parentWidget;

    ...

    QStyledItemDelegate::paint(painter, option, index);
    parentWidget->style()->drawControl(QStyle::CE_PushButton, &button, painter, parentWidget);
}


В стилях как обычно:
Код

QPushButton {
  border: 1px solid red;
  background-color: pink;
}

PM MAIL   Вверх
JohanMT
Дата 18.2.2016, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 12.2.2016

Репутация: нет
Всего: нет



Amp, Спасибо! Получилось наконец-то. Без костылей че то мне кажется тут никак... уже все перебровал

Это сообщение отредактировал(а) JohanMT - 18.2.2016, 18:27
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1315 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.