QTableView不接受QDateTime

QTableView不接受QDateTime,qt,c++11,qt5,qt4,Qt,C++11,Qt5,Qt4,我正在设计一个包含多个字段和功能的主要用户界面。 然而,为了缩小这个问题,我创建了一个包含4列的小应用程序:name、image、dataDatabase和dateTime 我有一个带有QTableView的主窗口,只要我在QTableView中单击鼠标右键,就会打开一个AddItem对话框,其中包含: nameLineEdit ImLineEdit imageLineEdit 日期时间编辑 我遇到的问题是,我找不到通过AddItemDialog接受dateTimeEdit的方法 我并没有去da

我正在设计一个包含多个字段和功能的主要用户界面。 然而,为了缩小这个问题,我创建了一个包含4列的小应用程序:name、image、dataDatabase和dateTime

我有一个带有QTableView的主窗口,只要我在QTableView中单击鼠标右键,就会打开一个AddItem对话框,其中包含:

  • nameLineEdit
  • ImLineEdit
  • imageLineEdit
  • 日期时间编辑
  • 我遇到的问题是,我找不到通过AddItemDialog接受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;
    };
    
    及其相关的项目.cpp

    Item::Item(const double dateTime,
               const QString &name, const QString &image,
               const QByteArray &imagesData)
    {
        mName = name;
        mImage = image;
        mImagesData = imagesData;
        mDateTime = dateTime;
    }
    
    #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)
    {
    }
    
    我创建了一个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.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;
    };
    
    #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
    
    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();
    }
    
    因此,总结一下:

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

  • Item::Item(const double dateTime,
               const QString &name, const QString &image,
               const QByteArray &imagesData)
    {
        mName = name;
        mImage = image;
        mImagesData = imagesData;
        mDateTime = dateTime;
    }
    
    #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从AddItemDialog.cpp传递到主窗口

  • 此外,在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)" /// <---
    
    然后直接传递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();
    }
    

    你在使用什么数据库?嗨,eyllanesc,我在使用QSQlite。你可以通过Githube共享你的.ui或更好的项目。我可以把我的Bitbucket递给你吗?把你项目的链接递给我