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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: замена QSqlRelationalDelegate??  (Прочитано 11242 раз)
em
Гость
« : Май 21, 2008, 15:42 »

Приветствую всех, =)

Нужно сделать таблицу используя QTableWidget или QTableView, чтобы в одном столбце был ComboBox
вот что есть
Код:
#include <QtGui>

#include "signaldelegate.h"

SignalDelegate::SignalDelegate(int selSignalColumn, QObject *parent)
: QItemDelegate(parent)
{
this->selSignalColumn = selSignalColumn;
}

QWidget *SignalDelegate::createEditor(QWidget *parent,
        const QStyleOptionViewItem &option,
        const QModelIndex &index) const
{
if (index.column() == selSignalColumn) {
QComboBox *box = new QComboBox(parent);
box->setEditable(true);
box->setAutoCompletion(true);
//box->setModel(const_cast<QAbstractItemModel*>(model));
box->setModelColumn(index.column());
box->installEventFilter(const_cast<SignalDelegate*>(this));
return box;
} else {
return QItemDelegate::createEditor(parent, option, index);
}
}

void SignalDelegate::setEditorData(QWidget *editor,
                                  const QModelIndex &index) const
{
if (index.column() == selSignalColumn) {
QComboBox* box = qobject_cast<QComboBox*>(editor);

const QAbstractItemModel *model = index.model();

if (!box || !model)
QItemDelegate::setEditorData(editor, index);
box->setCurrentIndex(index.row());

} else {
QItemDelegate::setEditorData(editor, index);
}
}

void SignalDelegate::setModelData(QWidget *editor,
                                 QAbstractItemModel *model,
                                 const QModelIndex &index) const
{
if (index.column() == selSignalColumn) {
QComboBox *box = qobject_cast<QComboBox*>(editor);
if (!box)
return QItemDelegate::setModelData(editor, model, index);

model->setData(index, box->currentText(), Qt::DisplayRole);
model->setData(index, box->currentText(), Qt::EditRole);
} else {
return QItemDelegate::setModelData(editor, model, index);
}
}


Код:
#ifndef SIGNALDELEGATE_H
#define SIGNALDELEGATE_H

#include <QItemDelegate>

class SignalDelegate: public QItemDelegate
{
Q_OBJECT

public:
SignalDelegate(int selSignalColumn, QObject *parent = 0);

    //void paint(QPainter *painter, const QStyleOptionViewItem &option,
    //           const QModelIndex &index) const;
    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;

//private slots:
    //void commitAndCloseEditor();

private:
int selSignalColumn;
};

#endif

Но вот не пойму какую модель для этого нужно? как заполнять этот комбо бокс
например таблица 0-й сталбей строка а 1-й выпадающий список строк,

для создания таких таблиц нашел QSqlRelationalDelegate и QSqlRelationalTableModel но это с базой а у меня БД нету!

Подскажите плиз))))


« Последнее редактирование: Май 21, 2008, 15:46 от em » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Май 21, 2008, 15:46 »

и что? в чем вопрос? название темы и ее содержание как связано?
Записан

Юра.
em
Гость
« Ответ #2 : Май 21, 2008, 15:47 »

и что? в чем вопрос? название темы и ее содержание как связано?
я щас отредактил его недописав нащал Пост... сорри
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Май 21, 2008, 15:55 »

т.е. если не забивать голову названиями, то тебе надо добавить в конкретный столбец выподающий список, я правильно понял?
« Последнее редактирование: Май 21, 2008, 16:08 от lit-uriy » Записан

Юра.
em
Гость
« Ответ #4 : Май 21, 2008, 16:08 »

т.е. если не забивать голову названиями, то тебе надо добавить в конкретный столбец выподающий список, я правильно понял?
Так точно =)
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Май 21, 2008, 16:08 »

глянь тему, по моему для тебя: http://prog.org.ru/forum/index.php/topic,7071.msg34827.html
Записан

Юра.
em
Гость
« Ответ #6 : Май 21, 2008, 16:51 »

глянь тему, по моему для тебя: http://prog.org.ru/forum/index.php/topic,7071.msg34827.html
не нашел как модель прикручивать к таким таблицам...
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Май 21, 2008, 16:58 »

у тебя представление QTableView, если базы нет, то достаточно применить простую модель типа QStandardItemModel
для представления можно сделать делегат в виде выподающего списка, а QSqlRelationalDelegate тебе не надо!
если опять не понятно смотри пример тут
Записан

Юра.
em
Гость
« Ответ #8 : Май 22, 2008, 10:13 »

у тебя представление QTableView, если базы нет, то достаточно применить простую модель типа QStandardItemModel
для представления можно сделать делегат в виде выподающего списка, а QSqlRelationalDelegate тебе не надо!
если опять не понятно смотри пример тут
посмотрел этот класс!..
а в чем тогда фишка созданной модели? если происходит следующее:
создает модель...
Код:
    QStandardItemModel model(4, 2);

// Создадим табличное представление
// и установим для него модель
    QTableView tableView;
    tableView.setModel(&model);
потом заполняет её строками..
Код:
for (int row = 0; row < 4; row++)
{
// создаем строчки
        for (int column = 0; column < 2; column++)
{
// создаем колонки
            QModelIndex index = model.index(row, column, QModelIndex());
model.setData(index, QVariant((row) + (column)));//
        }
    }

А после в классе  YStdDelegate в методе createEditor создает ComboBox и заполняет его
Код:
			QComboBox *cmbox = new QComboBox(parent);
cmbox->addItem("0");
cmbox->addItem("1");
Получается что столбец с ComboBox ом заполняется в одном месте и заполняется списком данных..
а модель просто таблица и никак не связана с содержимым? Объясните смысл...
« Последнее редактирование: Май 22, 2008, 10:17 от em » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Май 22, 2008, 13:27 »

Получается что столбец с ComboBox ом заполняется в одном месте и заполняется списком данных..
а модель просто таблица и никак не связана с содержимым? Объясните смысл...
нужен был комбо бокс, с двумя значениями "0" и "1" т.е. булевые. ты заполняй тем что тебе надо
Записан

Юра.
em
Гость
« Ответ #10 : Май 23, 2008, 21:45 »

в ::createEditor соединяю следующие сигнал и слот
Код:
QWidget *SignalDelegate::createEditor(QWidget *parent,
        const QStyleOptionViewItem &option,
        const QModelIndex &index) const
{
if (index.column() == selSignalColumn) {
QComboBox *box = new QComboBox(parent);
box->setEditable(true);
box->setAutoCompletion(true);

box->addItem("Signal 2");
box->addItem("Signal 3");

box->installEventFilter(const_cast<SignalDelegate*>(this));
                      connect(box, SIGNAL(currentIndexChanged()),
                                  this, SLOT(commitAndCloseEditor())); /////// Вот этот конект
return static_cast<QWidget *>(box);
} else {
return QItemDelegate::createEditor(parent, option, index);
}
}

в SignalDelegate::commitAndCloseEditor() выдаю сообщение msg
Код:
void SignalDelegate::commitAndCloseEditor()
{
QMessageBox msgBox;
msgBox.setText(QString("%1").arg("msg"));
msgBox.exec();
}

но при изменении значения(строки) в ComboBox сообщения не выдается, подскажите пожалуйста в чем может быть проблемма?

пробывал сигналы
Цитировать
void activated ( int index )
void activated ( const QString & text )
void currentIndexChanged ( int index )
void currentIndexChanged ( const QString & text )
void editTextChanged ( const QString & text )
void highlighted ( int index )
void highlighted ( const QString & text )

сообщения всеравно небыло



Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #11 : Май 23, 2008, 22:46 »

на счет Сигналов и слотов в делегате, я не знаю, будет ли это работать. Грустный

А нужны ли они здесь? Для чего ты их хочешь использовать?
« Последнее редактирование: Май 23, 2008, 22:47 от lit-uriy » Записан

Юра.
em
Гость
« Ответ #12 : Май 24, 2008, 11:18 »

на счет Сигналов и слотов в делегате, я не знаю, будет ли это работать. Грустный

А нужны ли они здесь? Для чего ты их хочешь использовать?
По идеи должны. Я это взял в книге Бланшет (гл 10. Создание пользовательских делегатов) там пример с QTimeEdit сигнал у него editingFinished(). т.е. по завершении редактирования вызывается слот нужный.
Для чего мне это нужно? Хочу создать массив размером 8 значений( int arr[8]Подмигивающий и сохранять в нём индекс( есть QComboBox::currentIndex()) выбранного значения ComboBox.
8 потомучто у меня в таблице всего 8 строк, следовательно столько же ComboBox.
И все бы нормально но так как ComboBox 'ы заполяняются в SignalDelegate::createEditor путем
Код:
box->addItem("Signal 2");
то когда редактируешь столбец с Комбо по F2 либо двойным кликом то всегда становится выбранной 1-я запись в ComboBox.
Поэтому я хочу в конструкторе класса инициализировать массив значениями -1 (значит ничего не выбранно в КомбоБоксе)
а после изменять на новое значение в ::commitAndCloseEditor() т.е. когда пользователь выбрал значение.
И уже в ::setEditirData делать что то вроде этого
Код:
box->setCurrentIndex(arr[index.row()]);

Возможно есть другой способ если знаете подскажите или хотябы подскажите насчет сигналов.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #13 : Май 24, 2008, 14:03 »

а что мешает заполнять делегат данными в setEditorData()?
Записан

Юра.
ритт
Гость
« Ответ #14 : Май 24, 2008, 14:10 »

а потом прочитать по сетМодельДата() Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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