我来自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();
}
}