我正在设计一个具有多个字段和功能的主要用户界面。但是,为了缩小问题,我创建了一个包含4列的小型应用程序:名称,图像,数据库,日期时间。
我有一个带有QTableView的MainWindow,只要在QTableView中右键单击一个AddItemDialog就会打开:
1)nameLineEdit
2)ImLineEdit
3)imageLineEdit-它包含图像的路径
4)dateTimeEdit
在这里也可以看到一个最小的最小示例:请注意,我正在使用菜单来擦除/添加记录
我遇到的问题是,我不一定要在QTableView上保存图像(BLOB),如果发生这种情况,我希望该列接受TEXT“ No Image”,但是如果在存储期间对于图片,用户决定返回并保存图片,这是可能的。
因此,为了提供直观的理解,请参见尝试不保存图像时出现的错误:
到目前为止我尝试过的事情:
这个想法(以及我试图实现的可能解决方案)是创建一个更新行的函数,但它不起作用:
bool dataBase::updateItem(const Item &item)
{
QSqlQuery qry;
qry.prepare(" UPDATE Fish_Table SET " \
" name = ?, image = ?, dataDataBase = ?, dateTime = ?");
q.addBindValue(item.name());
q.addBindValue(item.image());
q.addBindValue(item.imagesData());
q.addBindValue(item.dateTime());
}
最小应用程序的代码如下所示:
我将下面应用程序的最重要部分与我遵循的过程的相关描述一起包括在内:
我创建了一个包含 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.cpp ,其中包含我要传递给MainWindow的QTableView的字段。
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();
}
预期结果::如果用户决定保存图像没有问题,但是如果用户决定不保存图像,则它应该在“图片,如何在SQLITE / QT中处理此异常? 参见下面我尝试实现的正确方法:
实际结果:我只能保存图像。如果我没有收到错误消息。
感谢对此进行解释。