QTableView不接受QDateTime

时间:2018-11-25 19:46:23

标签: qt c++11 qt5 qt4

我正在设计一个具有多个字段和功能的主要用户界面。 但是,为了缩小问题,我创建了一个包含4列的小型应用程序:名称,图像,数据库,日期时间。

我有一个带有QTableView的MainWindow,在QTableView中右键单击一个AddItemDialog就会打开:

  1. nameLineEdit
  2. ImLineEdit
  3. imageLineEdit
  4. dateTimeEdit

我遇到的问题是我找不到通过AddItemDialog接受4)dateTimeEdit的方法。

我没有“去插入” dateTimeEdit,因为我不认为必须这样做。 我认为我没有针对日期和时间进行正确的转换,但是请告知可能出现的问题。

我将下面应用程序的最重要部分与我遵循的过程的相关描述一起包括在内:

我创建了一个包含 item.h 字段的项目:

class Item
{
public:
    Item(const double dateTime,
         const QString &name = "", const QString &image = "",
         const QByteArray &imagesData = QByteArray());
    QString name() const { return mName; }
    QString image() const { return mImage; }
    QByteArray imagesData() const { return mImagesData; }
    double dateTime() const { return mDateTime; }
private:
    QString mName;
    QString mImage;
    QByteArray mImagesData;
    double mDateTime;
};

及其相关的 item.cpp

Item::Item(const double dateTime,
           const QString &name, const QString &image,
           const QByteArray &imagesData)
{
    mName = name;
    mImage = image;
    mImagesData = imagesData;
    mDateTime = dateTime;
}

我创建了一个 database.h 表,该表将包含以下参数:

class dataBase : public QObject
{
    Q_OBJECT
public:
    explicit dataBase(QObject *parent = nullptr);
    bool inizializationDataBase(const QString &nameDataBase);
    bool configureDataBase();
    QString getError() const { return mError; }
    bool addItem(const Item &item);
private:
    QSqlDatabase mDatabase;
    QString mError;
};

及其相关的 database.cpp 文件-我仅包含该文件中最重要的代码:

#define CREATE_TABLE \
     " CREATE TABLE IF NOT EXISTS Fish_Table" \
     " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" \
     ", name TEXT NOT NULL" \
     ", image TEXT NOT NULL" \
     ", dataDataBase BLOB NOT NULL" \
     ", dateTime DOUBLE NOT NULL)"

dataBase::dataBase(QObject *parent)
    : QObject(parent)
{
}

bool dataBase::inizializationDataBase(const QString &nameDataBase) {
    // code
}

bool dataBase::addItem(const Item &item) {
    QSqlQuery q;
    q.prepare("INSERT INTO Fish_Table (name, image, dataDatabase, dateTime) VALUES (?,?,?,?)");
    q.addBindValue(item.name());
    q.addBindValue(item.image());
    q.addBindValue(item.imagesData());
    q.addBindValue(item.dateTime());
    bool ok = q.exec();
    if (!ok) {
        mError = q.lastError().text();
    }
    return ok;
}

,最后是 AddItemDialog.h AddItemDialog.cpp ,其中包含我要传递给MainWindow的QTableView的字段。

AddItemDialog.h

namespace Ui
{
class AddItemDialog;
}

class AddItemDialog : public QDialog
{
    Q_OBJECT
public:
    explicit AddItemDialog(QWidget *parent = nullptr);
    ~AddItemDialog();
    Item item() const { return mItem; }
private slots:
    void on_toolButton_clicked();
    void on_buttonBox_accepted();
    void on_buttonBox_rejected();
private:
    Ui::AddItemDialog *ui;
    Item mItem;
};

AddItemDialog.cpp

AddItemDialog::AddItemDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::AddItemDialog)
{
    ui->setupUi(this);
    auto fileSystemModel = new QFileSystemModel(this);
    fileSystemModel->setRootPath(QDir::rootPath());
    ui->imageLineEdit->setCompleter(new QCompleter(fileSystemModel,this));
    QDateTime dateTime;
    dateTime.setDate(QDate::currentDate());
}

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

void AddItemDialog::on_toolButton_clicked()
{
    auto nameDataBase = QFileDialog::getOpenFileName(this, "Open Images", QDir::rootPath(),
                      "Images (*.png *.jpg *jpeg *.tif *.tiff);;Any type (*.*)");
    ui->imageLineEdit->setText(nameDataBase);
}

void AddItemDialog::on_buttonBox_accepted()
{
    QFile dataBase(ui->imageLineEdit->text());
    if (!dataBase.open(QIODevice::ReadOnly)) {
        QMessageBox::critical(this, "Error", dataBase.errorString());
        return;
    }
    mItem = Item(ui->nameLineEdit->text(),
                 ui->ImLineEdit->text(),dataBase.readAll());
    dataBase.close();
    accept();
}

回顾一下:

  1. 我不确定是否在 Item.h / Item.cpp database.h / database.cpp 上为QDateTime转换提供了正确的格式

  2. 我不确定如何将QDateTime从 AddItemDialog.cpp 传递到MainWindow

另外在 AddItemDialog.cpp 上,我刚开始时遇到以下错误: AddItemDialog的构造函数必须显式初始化没有默认构造函数的成员mItem

感谢您提供我已经有几天的信息。

1 个答案:

答案 0 :(得分:1)

使用DATETIME作为字段并直接使用QDateTime:

#define CREATE_TABLE \
     " CREATE TABLE IF NOT EXISTS Fish_Table" \
     " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL" \
     ", name TEXT NOT NULL" \
     ", image TEXT NOT NULL" \
     ", dataDataBase BLOB NOT NULL" \
     ", dateTime DATETIME NOT NULL)" /// <---

然后更改项目:

item.h

#ifndef ITEM_H
#define ITEM_H
#include <QDateTime>
#include <QString>

class Item
{
public:
    Item(const QDateTime & dateTime=QDateTime::currentDateTime(),
         const QString &name = "", const QString &image = "",
         const QByteArray &imagesData = QByteArray());
    QString name() const { return mName; }
    QString image() const { return mImage; }
    QByteArray imagesData() const { return mImagesData; }
    QDateTime dateTime() const { return mDateTime; }
private:
    QString mName;
    QString mImage;
    QByteArray mImagesData;
    QDateTime mDateTime;
};

#endif // ITEM_H

item.cpp

#include "item.h"

Item::Item(const QDateTime &dateTime,
           const QString &name, const QString &image,
           const QByteArray &imagesData):
    mName(name),
    mImage(image),
    mImagesData(imagesData),
    mDateTime(dateTime)
{
}

然后按照指示直接传递QDateTime:

void AddItemDialog::on_buttonBox_accepted()
{
    QFile dataBase(ui->imageLineEdit->text());
    if (!dataBase.open(QIODevice::ReadOnly)) {
        QMessageBox::critical(this, "Error", dataBase.errorString());
        return;
    }
    mItem = Item(ui->dateTimeEdit->dateTime(),
                 ui->nameLineEdit->text(),
                 ui->ImLineEdit->text(),
                 dataBase.readAll());
    dataBase.close();
    accept();
}