Russian Qt Forum

Qt => Базы данных => Тема начата: sinbad7 от Сентябрь 13, 2011, 16:43



Название: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 13, 2011, 16:43
Имеется SQLite таблица с полем типа TIME она подключается с помощью QSqlTableModel к TableView. Данные отображаются с миллисекундами, а мне надо HH:MM, как это можно сделать?


Название: Re: TableView отображение времени
Отправлено: gorec323 от Сентябрь 13, 2011, 16:51
Как вариант, определить свой делегат для отображения времени в нужном формате.


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 13, 2011, 17:01
Нельзя ли небольшой пример?


Название: Re: TableView отображение времени
Отправлено: Странник от Сентябрь 13, 2011, 17:16
поиск по форуму и чтение доков иногда помогает, говорят = ) вот например из недавнего http://www.prog.org.ru/index.php?topic=19358


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 13, 2011, 18:22
Цитировать
вот например из недавнего http://www.prog.org.ru/index.php?topic=19358
в этом посте спрашивающему не помогло))
я еще не понял вот это
Код:
QList<QTableView*> list=findChildren <QTableView*>();

и устанавливать делегат в цикле для TableView это как?


Название: Re: TableView отображение времени
Отправлено: Странник от Сентябрь 13, 2011, 23:55
унаследоваться от QStyledItemDelegate:
Код:
#include <QStyledItemDelegate>

class MyDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit MyDelegate(QObject *parent = 0);

    virtual QString displayText(const QVariant &value, const QLocale &locale) const;
};

реализовать преобразование даты/времени в строку, например, так:
Код:
QString MyDelegate::displayText(const QVariant &value, const QLocale &locale) const
{
    switch (value.type())
    {
        case QVariant::Date:
            return locale.toString(value.toDate(), "dd.MM.yyyy");
        break;

        case QVariant::Time:
            return locale.toString(value.toTime(), "hh:mm");
        break;

        case QVariant::DateTime:
            return locale.toString(value.toDateTime(), "dd.MM.yyyy hh:mm");
        break;

        default:
            return QStyledItemDelegate::displayText(value, locale);
        break;
    }
}

установить делегат для представления:
Код:
    tableView->setItemDelegateForColumn(1, new MyDelegate(tableView));


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 03:46
Спасибо, попробую
мне наверно хватит
Цитировать
return locale.toString(value.toTime(), "hh:mm");


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 15:34
Не работает выдает ошибку


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 15:36
Вот проект на всякий случай


Название: Re: TableView отображение времени
Отправлено: BRE от Сентябрь 14, 2011, 15:39
Не работает выдает ошибку
Эта ошибка про то, что ты не правильно делегат устанавливаешь, и скорее всего его  объект на стеке создаешь?


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 15:45
Код:
ui->tableView->setItemDelegateForColumn(1, MyDelegate(ui->tableView));


Название: Re: TableView отображение времени
Отправлено: GreatSnake от Сентябрь 14, 2011, 15:48
Код:
ui->tableView->setItemDelegateForColumn(1, MyDelegate(ui->tableView));
Тебе же BRE сказал уже:
Цитировать
скорее всего его  объект на стеке создаешь?


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 15:52
если ставлю так
Код:
ui->tableView->setItemDelegateForColumn(1, new MyDelegate(ui->tableView));
то выдает другую ошибку


Название: Re: TableView отображение времени
Отправлено: GreatSnake от Сентябрь 14, 2011, 15:59
Ну дык, а где имплементация конструктора MyDelegate(QObject *parent)?


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 16:09
mydelegate.h

Код:
#ifndef MYDELEGATE_H
#define MYDELEGATE_H

#include <QStyledItemDelegate>
#include <QObject>
class MyDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit MyDelegate(QObject *parent = 0);

    virtual QString displayText(const QVariant &value, const QLocale &locale) const;
};
#endif // MYDELEGATE_H

mydelegate.cpp

Код:
#include <QDateTime>
#include "mydelegate.h"
QString MyDelegate::displayText(const QVariant &value, const QLocale &locale) const
{
 
    return locale.toString(value.toTime(), "hh:mm");

}


mainwindow.cpp

Код:
#include <QtSql>
#include <QMessageBox>

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mydelegate.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   md=new QSqlTableModel(this);
   md->setTable("test");
   md->setEditStrategy(QSqlTableModel::OnManualSubmit);
   md->select();
   md->setHeaderData(0,Qt::Horizontal, trUtf8("kod"));
   md->setHeaderData(1,Qt::Horizontal, trUtf8("name"));
   md->setHeaderData(2,Qt::Horizontal, trUtf8("time"));
   ui->tableView->setModel(md);
   ui->tableView->setItemDelegateForColumn(1, new MyDelegate(ui->tableView));

}

MainWindow::~MainWindow()
{
    delete ui;
}




Название: Re: TableView отображение времени
Отправлено: GreatSnake от Сентябрь 14, 2011, 16:11
Ну и?
Где тело конструктора-то ???


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 16:21
Делал как в примере Странника, а куда поставить?


Название: Re: TableView отображение времени
Отправлено: GreatSnake от Сентябрь 14, 2011, 16:25
Делал как в примере Странника, а куда поставить?
Мде, с азами C++ похоже совсем туго :(

Код
C++ (Qt)
MyDelegate::MyDelegate( QObject* parent )
: QStyledItemDelegate( parent )
{
}


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 16:40
А в каком месте программы это должно быть?


Название: Re: TableView отображение времени
Отправлено: GreatSnake от Сентябрь 14, 2011, 16:43
А в каком месте программы это должно быть?
Мде, совсем грустно :(
Хотя бы в mydelegate.cpp.


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 16:48
mydelegate.cpp
Код:
#include <QDateTime>
#include "mydelegate.h"

MyDelegate::MyDelegate( QObject* parent = 0 )
: QStyledItemDelegate( parent )
{
}
QString MyDelegate::displayText(const QVariant &value, const QLocale &locale) const
{

    return locale.toString(value.toTime(), "hh:mm");

}

выдает ошибку


Название: Re: TableView отображение времени
Отправлено: GreatSnake от Сентябрь 14, 2011, 16:54
См. в моём исправленном посте (http://www.prog.org.ru/index.php?topic=19408.msg131086#msg131086).
Учи C++! Сей форум не для этого.


Название: Re: TableView отображение времени
Отправлено: sinbad7 от Сентябрь 14, 2011, 17:00
GreatSnake! Спасибо огромное, все заработало!!!