QDateTime не принимается QTableView - PullRequest
0 голосов
/ 25 ноября 2018

Я разрабатываю основной пользовательский интерфейс с несколькими полями и функциями.Однако, чтобы уменьшить проблему, я создал небольшое приложение с 4 столбцами: name, image, dataDatabase, dateTime.

У меня есть MainWindow с QTableView, как только я щелкаю правой кнопкой мыши внутри QTableView, открывается AddItemDialogс:

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

У меня проблема в том, чтоЯ не могу найти способ принять 4) dateTimeEdit через AddItemDialog.

Я не «пошел в слот» 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 - IЯ включаю только самый важный фрагмент кода для этого файла:

#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 , который содержит поля Iпытаюсь перейти к QTableView MainWindow.

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. Я не уверен, что предоставил правильный формат для QDateПреобразование времени на Item.h / Item.cpp и database.h / database.cpp

  2. Я не уверен, как пройтиQDateTime из AddItemDialog.cpp в MainWindow

Дополнительно в AddItemDialog.cpp У меня возникла следующая ошибка в самом начале: Конструктор для AddItemDialog должен явно инициализировать член mItem, у которого нет конструктора по умолчанию

Спасибо за предоставленную информацию по этой проблеме, которая возникла у меня в течение нескольких дней.

1 Ответ

0 голосов
/ 26 ноября 2018

Используйте 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();
}
...