【发布时间】:2019-03-20 02:04:00
【问题描述】:
我一直在研究如何以编程方式使用QPushButton 将加载在QGraphicsView 上的图像存储到QTableView 的行中,但到目前为止我发现的信息并不多。
我有 1 个QGraphicsView、一个QPushButton(发送按钮)、一个QTableView 和一个QLineEdit。当我使用加载按钮上传图像时,我在QGraphicsView 和QLineEidt 上都显示它们(我显示图像的路径),如果我单击发送按钮,应该添加QLineEdit 的文本在QTableView 的第一行(正在发生),图像应该存储在QTableView 中。
但是,QGraphicsView 上的图像没有被存储到QTableView 并且没有任何内容被传递。
目前情况如下:
预期的行为是:
我创建了一个ItemDelegate 类,负责调整QGraphicsView 上的图像大小以存储在QTableView 中
该部分如下所示:
这是 mainwindow.h
#include <QGraphicsView>
#include <QGraphicsScene>
#include "imagedelegate.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
void addData();
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
private slots:
void on_sendBtn_clicked();
void on_loadBtn_clicked();
private:
Ui::MainWindow *ui;
QStandardItemModel *model;
QGraphicsScene *leftScene;
};
#endif // MAINWINDOW_H
这里是 mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "imagedelegate.h"
#include <QGraphicsPixmapItem>
#include <QBuffer>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
leftScene = new QGraphicsScene(this);
ui->graphicsView->setScene(leftScene);
ui->graphicsView->show();
model = new QStandardItemModel();
ui->tableView->setModel(model);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::addData()
{
// Path on the first column
QStandardItem *pathAItem = new QStandardItem(ui->lineEdit->text());
// Image on the second column - not working yet
//QStandardItem *image1 = new QStandardItem(/*ui->graphicsView->*/);
QPixmap image1;
QByteArray img1Array;
QBuffer buffer1(&img1Array);
buffer1.open(QIODevice::WriteOnly);
image1.save(&buffer1, "PNG");
QList<QStandardItem*> row;
row << pathAItem;
model->setColumnCount(1);
model->appendRow(row);
}
void MainWindow::on_sendBtn_clicked()
{
addData();
}
void MainWindow::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
QString colName = index.model()->headerData(index.column(), Qt::Horizontal).toString();
if(colName == "image1")
{
QPixmap iconPix;
if(!iconPix.loadFromData(index.model()->data(index).toByteArray())) {
}
iconPix = iconPix.scaledToHeight(32);
painter->drawPixmap(option.rect.x(),option.rect.y(),iconPix);
} else {
// QStyledItemDelegate::paint(painter, option, index);
}
}
如果您复制和粘贴,整个代码将编译,这样您就可以看到我遇到的问题。
请解释一下这个问题。
【问题讨论】:
-
我想知道,您是否可以通过在您的
QStandardItem对象上调用setIcon(QIcon(myLoadedPixmap))来获得您想要的行为,而不是编写自定义委托?无论哪种方式都可以工作,但setIcon()方法要容易得多。 -
@JeremyFriesner 感谢您抽出宝贵时间阅读问题。如何修改我根据您的建议编写的代码?
-
去掉
ImageDelegate类,但是使用你写的iconPixmap代码(iconPixmap->loadFromData()等)设置一个包含你的图像的QPixmap对象,然后调用pathAItem->setIcon(iconPixmap); -
好的,我将问题编辑到最低限度。不使用
Delegate是个好主意。该程序仍然无法编译。我在void MainWindow::paint()函数中设置图像,但没有任何反应。 -
您不需要任何
paint()方法 AFAIK。请将您的代码放在addData()中。
标签: c++ c++11 qt5 qtableview qgraphicsview