Russian Qt Forum

Qt => Общие вопросы => Тема начата: rarom от Май 12, 2010, 12:16



Название: QSqlRelationalTableModel и QTableView
Отправлено: rarom от Май 12, 2010, 12:16
Из таблицы Mysql базы данных строится модель и потом выводится в QTableView. При этом ничего в базе данных редактировать не требуется. Требуется только отображать.
А вопрос такой:
В одной колонке бд хранится значение типа bool (0 или 1) и мне требуется вместо 0 или 1 выводить в QTableView текстом фразу в колонку, заменяя эти 0 и 1 соотвественно в одном случае(0) одну, в другом случае(1) другую. В данный момент выводится или 0 или 1 Как это реализовать, подскажите пожалуйста, буду благодарен ?


Название: Re: QSqlRelationalTableModel и QTableView
Отправлено: crossly от Май 12, 2010, 12:22
если редактировать не нужно используй QSqlQueryModel.... решения 2.... 1.унаследоватся и переопределить метод data .... 2. Использовать делегат


Название: Re: QSqlRelationalTableModel и QTableView
Отправлено: rarom от Май 12, 2010, 12:24
если редактировать не нужно используй QSqlQueryModel.... решения 2.... 1.унаследоватся и переопределить метод data .... 2. Использовать делегат

Спасибо за ответ.
А можно пример пожалуйста.


Название: Re: QSqlRelationalTableModel и QTableView
Отправлено: crossly от Май 12, 2010, 12:24
пример чего??


Название: Re: QSqlRelationalTableModel и QTableView
Отправлено: rarom от Май 12, 2010, 19:27
Не знаком еще с делегатами... Гуглил\смотрел стандартные примеры..не совсем понял
Вот допустим пример делегата, который выравнивает по центру

Код:
class Delegate: public QStyledItemDelegate {
        int aFlags;
public:
        Delegate( int flags ) :
                aFlags( Qt::AlignVCenter | flags ) {
        }

        void paint( QPainter* p, const QStyleOptionViewItem& o, const QModelIndex& i ) const {
                Q_ASSERT( i.isValid() );

                QStyleOptionViewItemV4 opt = o;
                initStyleOption( &opt, i );
                opt.displayAlignment = (Qt::Alignment) aFlags;

                QStyle *style = QApplication::style();
                style->drawControl( QStyle::CE_ItemViewItem, &opt, p, NULL );
        }
};

Применил ( ui->booksView->setItemDelegateForColumn( 6, new Delegate() ); ) работает.

Как я понимаю мне нужно


class Delegate : public QItemDelegate {
public:

....


и переопределить метод setEditorData


Название: Re: QSqlRelationalTableModel и QTableView
Отправлено: crossly от Май 12, 2010, 19:51
нет... достаточно paint (вам же только для отображения).... смотрите i.data().toInt().... и в зависимости от значения рисуете нужный текст


Название: Re: QSqlRelationalTableModel и QTableView
Отправлено: rarom от Май 12, 2010, 23:45
Спасибо. Разобрался.
Вот что получилось:
Код:
class place2text_delegate: public QItemDelegate {
public:
    void paint( QPainter* p, const QStyleOptionViewItem& o, const QModelIndex& i ) const {
            Q_ASSERT( i.isValid() );

            if( i.data().toInt() == 0 ){
                QString text = QString(tr("В библиотеке"));
                drawDisplay(p, o, o.rect, text);
            }
            else if( i.data().toInt() == 1){
                QString text = QString(tr("У студента"));
                drawDisplay(p, o, o.rect, text);
            }
            else{
                QString text = QString(tr("Неверные данные в БД"));
                drawDisplay(p, o, o.rect, text);
            }
            drawFocus(p, o, o.rect);
    }

};

Код:
ui->booksView->setItemDelegateForColumn( 6, new place2text_delegate() );