QTableView 不接受 QDateTime

QDateTime not accepted by QTableView

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

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

  1. nameLineEdit
  2. ImLineEdit
  3. imageLineEdit
  4. 日期时间编辑

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

我没有 "go to slot" 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 table 将包含如下参数:

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.hAddItemDialog.cpp 包含我试图传递给主窗口的 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 和 [=50 上为 QDateTime 转换提供了正确的格式=]database.h / database.cpp

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

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

感谢您提供关于这个问题的信息,我已经困扰了几天。

使用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();
}