从数据库显示BLOB并在QTableView中更新图像

时间:2019-01-07 07:19:38

标签: c++ image qt crud

我来自Java背景。我有c ++的使用知识。我正在学习使用QT。我正在创建一个简单的应用程序来执行Mysql数据库的创建,读取,更新,删除和搜索记录。我正在使用QtableView来显示我的数据。到目前为止,我已经成功完成了所有工作,除了在QTableView中显示图像和编辑图像。我已将图像存储为ByteArray。

我尝试了几种方法,包括使用委托和QStandardItemModel,但未成功。也许我犯了一些错误。下面是我的canvas.cpp文件的代码。对于如何解决问题,我将非常感谢您的帮助或指导。我从Qt文档中没什么意义,但不是因为缺乏尝试性。

#include "canvas.h"
#include "ui_canvas.h"
#include <QListWidgetItem>

Canvas::Canvas(QWidget *parent) :
QDialog(parent),
ui(new Ui::Canvas)
{
ui->setupUi(this);

retrieveEngine = QSqlDatabase::addDatabase("QMYSQL");
retrieveEngine.setHostName("localhost");
retrieveEngine.setUserName("root");
retrieveEngine.setPassword("");
retrieveEngine.setDatabaseName("qtmitmysql");

if(retrieveEngine.open()){
    queryModel = new QSqlQueryModel();
    queryModel->setQuery("SELECT * FROM users");
    ui->tableView->setModel(queryModel);
}else
    QMessageBox::information(this, "Verbindung gescheitrt",
                      "Die Verbindung mit der Datenbank war nicht 
                                        erfolgreich");

    tableModel = new QSqlTableModel(this, retrieveEngine);
    tableModel->setTable("users");
    tableModel->select();
    qDebug() << tableModel->lastError().text();
    ui->tableView->setModel(tableModel);

    tableModel->setEditStrategy(QSqlTableModel::OnFieldChange);
    ui->tableView->hideColumn(0);
}

Canvas::~Canvas()
{
retrieveEngine.close();
delete ui;
}

void Canvas::on_searchBox_textChanged(const QString &arg1)
{
filterProxy = new QSortFilterProxyModel(this);
filterProxy->setSourceModel(tableModel);
filterProxy->setFilterCaseSensitivity(Qt::CaseInsensitive);
filterProxy->setFilterKeyColumn(-1);
filterProxy->setFilterFixedString(arg1);

ui->tableView->setModel(filterProxy);
}

void Canvas::on_removeThisRecord_clicked()
{
    QModelIndexList selectedIndexes = ui->tableView->selectionModel()- 
     >selectedIndexes();
    Q_ASSERT(std::equal(selectedIndexes.constBegin()+1,
                        selectedIndexes.constEnd(),
                        selectedIndexes.constBegin(),[](
                        const QModelIndex& a,
                        const QModelIndex& b)->bool{return 
a.parent()==b.parent();}));
    std::sort( selectedIndexes.begin(),
               selectedIndexes.end(),[](
               const QModelIndex& a,
               const QModelIndex& b)->bool{return b.row()<a.row();});
    QSet<int> deletedRows;
    for(auto i = 
selectedIndexes.constBegin();i!=selectedIndexes.constEnd();++i){
        if(deletedRows.contains(i->row()))
            continue;
        if(ui->tableView->model()->removeRow(i->row(),i->parent()))
            deletedRows << i->row();
    }
 }

0 个答案:

没有答案