GrabBag/BeltTearingApp/widgets/ImageGridWithTableWidget.cpp

145 lines
4.5 KiB
C++
Raw Normal View History

#include "ImageGridWithTableWidget.h"
#include "ImageGridWidget.h"
#include <QSplitter>
#include <QHeaderView>
#include <QFileInfo>
#include <QHBoxLayout>
#include <QResizeEvent>
ImageGridWithTableWidget::ImageGridWithTableWidget(QWidget* parent)
: QWidget(parent) {
setupUi();
}
void ImageGridWithTableWidget::setupUi() {
// 创建分割器
QSplitter* splitter = new QSplitter(Qt::Horizontal, this);
// 创建网格控件
m_grid = new ImageGridWidget(this);
// 创建表格控件
m_table = new QTableWidget(this);
m_table->setColumnCount(2);
m_table->setHorizontalHeaderLabels({"序号", "图片名称"});
m_table->setSelectionBehavior(QAbstractItemView::SelectRows);
m_table->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_table->setAlternatingRowColors(true);
m_table->setColumnWidth(0, 60 );
m_table->setColumnWidth(1, 120);
// 添加到分割器
splitter->addWidget(m_grid);
splitter->addWidget(m_table);
splitter->setStretchFactor(0, 3);
splitter->setStretchFactor(1, 1);
// 设置布局
QHBoxLayout* layout = new QHBoxLayout(this);
layout->addWidget(splitter);
layout->setContentsMargins(0, 0, 0, 0);
setLayout(layout);
// 连接信号槽
connect(m_grid, &ImageGridWidget::tileClicked, this, &ImageGridWithTableWidget::onGridTileClicked);
connect(m_table, &QTableWidget::itemSelectionChanged, this, &ImageGridWithTableWidget::onTableSelectionChanged);
}
void ImageGridWithTableWidget::setImages(int index, const QImage& image) {
m_grid->setImages(index, image);
// 更新表格中对应项的图片名称列
if (index >= 0 && index < m_table->rowCount()) {
// 注意这里我们不知道图片的文件名因为传入的是QImage
// 可以考虑在initImages时预先填充表格或者在其他地方维护文件名信息
QTableWidgetItem* nameItem = m_table->item(index, 1);
if (!nameItem) {
nameItem = new QTableWidgetItem("Image " + QString::number(index + 1));
m_table->setItem(index, 1, nameItem);
}
}
}
void ImageGridWithTableWidget::initImages(int count) {
// 初始化网格控件
m_grid->initImages(count);
// 填充表格数据
m_table->setRowCount(count);
for (int i = 0; i < count; ++i) {
// 序号列
QTableWidgetItem* indexItem = new QTableWidgetItem(QString::number(i + 1));
indexItem->setTextAlignment(Qt::AlignCenter);
m_table->setItem(i, 0, indexItem);
// 图片名称列,初始为空或默认值
QTableWidgetItem* nameItem = new QTableWidgetItem("");
m_table->setItem(i, 1, nameItem);
}
}
void ImageGridWithTableWidget::setSelectedIndex(int index) {
m_grid->setSelectedIndex(index);
syncSelectionToTable(index);
}
int ImageGridWithTableWidget::selectedIndex() const {
return m_grid->selectedIndex();
}
void ImageGridWithTableWidget::setExpandedIndex(int index) {
m_grid->setExpandedIndex(index);
}
int ImageGridWithTableWidget::expandedIndex() const {
return m_grid->expandedIndex();
}
int ImageGridWithTableWidget::columnCount() const {
return m_grid->columnCount();
}
int ImageGridWithTableWidget::rowCount() const {
return m_grid->rowCount();
}
QSize ImageGridWithTableWidget::tileBaseSize() const {
return m_grid->tileBaseSize();
}
void ImageGridWithTableWidget::onGridTileClicked(int index) {
syncSelectionToTable(index);
emit tileClicked(index);
}
void ImageGridWithTableWidget::onTableSelectionChanged() {
syncSelectionToGrid();
}
void ImageGridWithTableWidget::syncSelectionToTable(int index) {
if (index == -1) {
m_table->clearSelection();
} else if (index >= 0 && index < m_table->rowCount()) {
m_table->selectRow(index);
}
}
void ImageGridWithTableWidget::syncSelectionToGrid() {
QList<QTableWidgetItem*> selectedItems = m_table->selectedItems();
if (!selectedItems.isEmpty()) {
int row = selectedItems.first()->row();
if (m_grid && m_grid->selectedIndex() != row) {
m_grid->setSelectedIndex(row);
}
}
}
void ImageGridWithTableWidget::resizeEvent(QResizeEvent* event) {
QWidget::resizeEvent(event);
// 当组合控件大小变化时,确保网格能够自适应
// if (m_grid) {
// m_grid->updateTileSizes();
// }
}