QTableView 不接受 QDateTime
QDateTime not accepted by QTableView
我正在设计一个包含多个字段和功能的主要用户界面。
但是,为了缩小问题,我创建了一个包含 4 列的小型应用程序:名称、图像、数据库、日期时间。
我有一个带有 QTableView 的 MainWindow,只要我在 QTableView 中右键单击,就会打开一个 AddItemDialog:
- nameLineEdit
- ImLineEdit
- imageLineEdit
- 日期时间编辑
我遇到的问题是我找不到通过 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.h 和 AddItemDialog.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();
}
所以回顾一下:
我不确定我在 Item.h / Item.cpp 和 [=50 上为 QDateTime 转换提供了正确的格式=]database.h / database.cpp
我不确定如何将 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();
}
我正在设计一个包含多个字段和功能的主要用户界面。 但是,为了缩小问题,我创建了一个包含 4 列的小型应用程序:名称、图像、数据库、日期时间。
我有一个带有 QTableView 的 MainWindow,只要我在 QTableView 中右键单击,就会打开一个 AddItemDialog:
- nameLineEdit
- ImLineEdit
- imageLineEdit
- 日期时间编辑
我遇到的问题是我找不到通过 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.h 和 AddItemDialog.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();
}
所以回顾一下:
我不确定我在 Item.h / Item.cpp 和 [=50 上为 QDateTime 转换提供了正确的格式=]database.h / database.cpp
我不确定如何将 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();
}