Поиск:

Ответ в темуСоздание новой темы Создание опроса
> в QtreeWidget не отображается делегат QComboBox 
:(
    Опции темы
daemonaz
Дата 3.10.2014, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Уважаемые!
Прошу помочь разобраться проблему с делегатом, бьюсь как об стену, не могу понять почему в QTreeWidget не отображается делегат?
До этого использовал функцию setItemWidget, где создаю объект QComboBox и вставляю в ячейку, теперь ставится вопрос о создании делегата.

Вот мой код делегата

Код

#include <QComboBox>
#include "mycomboboxdelegate.h"

MyComboBoxDelegate::MyComboBoxDelegate(QObject *parent) :
    QItemDelegate(parent)
{
    // Object for calculate of editor size for some GUI themes
   QComboBox *editor = new QComboBox(static_cast<QWidget*>(parent));
   editor->setFrame(false);
   editor->adjustSize();
   editorSize = QSize(100,editor->height()*0.9);
   delete editor;

   //this->list=iList;
}

QWidget * MyComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
                          const QModelIndex &index) const
{
    QComboBox *editor = new QComboBox(parent);
    QStringList list ;
    list << "a" << "b" << "c" << "d";
    editor->setEditable(true);
    editor->addItems(list);
    return editor;
}

void MyComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString value = index.model()->data(index, Qt::EditRole).toString();
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    comboBox->setCurrentIndex(comboBox->findData(value,Qt::EditRole,Qt::MatchExactly));
    comboBox->addItem(value);
}

void MyComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                      const QModelIndex &index) const
{
    QComboBox *comboBox = static_cast<QComboBox*>(editor);
    QString value = comboBox->currentText();
    model->setData(index, value);
}

void MyComboBoxDelegate::updateEditorGeometry(QWidget *editor,
        const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

QSize MyComboBoxDelegate::sizeHint ( const QStyleOptionViewItem &/*option*/, const QModelIndex &/*index*/) const
{
    return editorSize;
}


код где создается объект делегата и вставляем в дерево в конструкторе MainWindow

Код


    QTreeWidget *tw =  new QTreeWidget(this);
    MyComboBoxDelegate *cb = new MyComboBoxDelegate(tw);

    tw->setHeaderLabels(QStringList() <<
                                      tr("1 столбец") <<
                                      tr("2 стобец") <<
                                      tr("3 столбец"));

    tw->addTopLevelItem(new QTreeWidgetItem(QStringList() << "aa" << ""));
    tw->setItemDelegateForColumn(1, cb);



вместо комбобокса отображается выделенный кубик, как заставить отображать в ячейке комбобокс?
буду признателен за любую помощь.
PM MAIL   Вверх
math64
Дата 6.10.2014, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Зачем это?
Цитата(daemonaz @  3.10.2014,  08:59 Найти цитируемый пост)
Код

MyComboBoxDelegate::MyComboBoxDelegate(QObject *parent) :
    QItemDelegate(parent)
{
    // Object for calculate of editor size for some GUI themes
   QComboBox *editor = new QComboBox(static_cast<QWidget*>(parent));
   editor->setFrame(false);
   editor->adjustSize();
   editorSize = QSize(100,editor->height()*0.9);
   delete editor;
   //this->list=iList;
}


Код

void MyComboBoxDelegate::updateEditorGeometry(
                                            QWidget *editor,
                                            const QStyleOptionViewItem &option,
                                            const QModelIndex &index) const

        editor->setGeometry(option.rect);
}


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


Бывалый
*


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

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



math64, это устанавливает фиксированный размер комбобокса, просто шаг отчаяния, нашел в инете и вставил туда кусок кода, но не пашет, если даже уберу эти куски, все равно не пашет, не отображается комбобокс, почему?
PM MAIL   Вверх
math64
Дата 6.10.2014, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Размер редактора задается в updateEditorGeometry(). Можно установить в option.rect, можно поменять на свой.
sizeHint() не нужен вовсе.
Кстати, QStringList проще создавать так:
Код

tr("1 столбец,2 стобец,3 столбец").split(',');

PM   Вверх
daemonaz
Дата 6.10.2014, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



math64, это я знаю, спасибо за подсказки, очень полезно. Но мне надо хотя бы показать комбобокс, не смогли бы у себя создать простенький проектик с делегатом, почему-то в упор не хочет отображаться, вместо комбобокса отображается выделенный прямоугольник.

Это сообщение отредактировал(а) daemonaz - 6.10.2014, 08:59
PM MAIL   Вверх
math64
Дата 6.10.2014, 10:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#include <QtGui/QApplication>
#include <QtGui/QTreeWidget>
#include <QtGui/QTreeWidgetItem>
#include <QtGui/QStyledItemDelegate>
#include <QtGui/QComboBox>

class MyDelegate : public QStyledItemDelegate
{
public:
    explicit MyDelegate(QObject* parent = NULL) : QStyledItemDelegate (parent) {}
    virtual ~MyDelegate() {}
    virtual QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        QComboBox* editor = new QComboBox(parent);
        editor->addItems(tr("item1,item2,item3,item4,item5").split(','));
        editor->setEditable(true);
        return editor;
    }
    virtual void setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        QComboBox* cb = (QComboBox*)editor;
        cb->setEditText(index.model()->data(index, Qt::EditRole).toString());
    }
    virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        QComboBox* cb = (QComboBox*)editor;
        QString value = cb->currentText();
        model->setData(index, value);
    }
    virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        editor->setGeometry(option.rect);
    }
};

int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  QTreeWidget tree;
  QTreeWidgetItem* item1 = new QTreeWidgetItem(&tree, QStringList("item1") );
  item1->setFlags(item1->flags() | Qt::ItemIsEditable);
  QTreeWidgetItem* item2 = new QTreeWidgetItem(item1, QStringList("item2") ) ;
  item2->setFlags(item2->flags() | Qt::ItemIsEditable);
  QTreeWidgetItem* item3 = new QTreeWidgetItem(item2, QStringList("item3") );
  item3->setFlags(item3->flags() | Qt::ItemIsEditable);
  QTreeWidgetItem* item4 = new QTreeWidgetItem(&tree, QStringList("item4") );
  item4->setFlags(item4->flags() | Qt::ItemIsEditable);
  QTreeWidgetItem* item5 = new QTreeWidgetItem(item4, QStringList("item5") );
  item5->setFlags(item5->flags() | Qt::ItemIsEditable);
  tree.setItemDelegate(new MyDelegate(&tree));
  tree.setEditTriggers(QTreeWidget::AllEditTriggers);
  tree.show();
  app.exec();
}

Все вероятно из-за отсутствия этого:
Код

  item1->setFlags(item1->flags() | Qt::ItemIsEditable);

PM   Вверх
daemonaz
Дата 6.10.2014, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



math64, спасибо! заработало!!  smile  Не смог догадаться что дело в свойствах итема. smile 
но отображается тогда когда щелкну по ячейке мышью в режиме редактирования, а как сделать чтобы постоянно отображался?
PM MAIL   Вверх
math64
Дата 6.10.2014, 10:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



нафиг нужно?
Если фсё-таки нужно, переопределяй
Код

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

создавай в нём временный QComboBox рисуй как его в ячейке.
PM   Вверх
daemonaz
Дата 6.10.2014, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



math64, спасибо тебе, добрый человек!  smile 
На случай если свыше команда придет, чтобы был постоянно нарисован комбобокс, а так конечно красивей будет без него, кому надо, пусть и щелкает.  smile 
PM MAIL   Вверх
math64
Дата 6.10.2014, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну едиственное исключение: когда в комбо-боксе два значения (true/false), его лучше заменить на чекбокс. Вот его-то действительно лучше показывать всегда.
PM   Вверх
daemonaz
Дата 6.10.2014, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

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

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


 




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


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

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