最简单的方法是什么(如果可能的话没有继承QTableWidget)将个人小部件(在我的情况下是一组QPixmap + QLabel + QComboBox)作为QTableWidget中的标题?
对于数组内容执行此操作相对容易,因为我们有函数QTableWidget::setCellWidget(int row, int column, QWidget * widget)
,但对于标题,我们只有QTableWidget::setHorizontalHeaderItem (int column, QTableWidgetItem * item)
非常感谢!
编辑: 也许我找到了一种非常不优雅的方法来做到这一点:
1)我用空的QString标题初始化每一列
2)我使用_table->horizontalHeader()->sectionPosition(index)
和_table->horizontalHeader()->sectionSize(index)
3)然后我在每个部分上绘制一个QFrame,带有一点边距
4)最后,我将QWidgets加载到这些QFrame中
如果其他人有更好的解决方案,我很感兴趣......
答案 0 :(得分:0)
我猜setCellWidget()
会完成这项工作。我没有看到更简单的方法。如果您不使用QFrame的其他功能,则可以使用QWidget而不是QFrame。
答案 1 :(得分:0)
我研究了很多来创建像过滤器头一样的excel。
更换标题没有简单的快捷方式。
最后我发现了这篇博文:Qt Support Weekly #27 – Widgets on a header。根据它的指南,这里有完整的代码来创建一个QHeaderView和QTableWidget子类,可以接受自定义小部件作为标题项:
customtableheader.h:
#ifndef CUSTOMTABLEHEADER_H
#define CUSTOMTABLEHEADER_H
#include <QWidget>
#include <QHeaderView>
class CustomTableHeader : public QHeaderView
{
public:
struct Margins
{
int left;
int right;
int top;
int buttom;
Margins(int left = 2, int right = 2, int top = 2, int buttom = 2);
};
CustomTableHeader(Qt::Orientation orientation,
QWidget *parent = nullptr);
void FixComboPositions();
void SetItemWidget(int index, QWidget * widget);
void SetItemMargins(int index, Margins margins);
private:
struct Item
{
QWidget * item;
Margins margins;
Item();
};
QMap<int, Item> mItems;
void showEvent(QShowEvent * e);
void HandleSectionResized(int i);
void HandleSectionMoved(int logical, int oldVisualIndex, int newVisualIndex);
};
#endif // CUSTOMTABLEHEADER_H
customtableheader.cpp:
#include "customtableheader.h"
CustomTableHeader::CustomTableHeader(Qt::Orientation orientation, QWidget * parent) :
QHeaderView(orientation, parent)
{
connect(this, &CustomTableHeader::sectionResized, this, &CustomTableHeader::HandleSectionResized);
connect(this, &CustomTableHeader::sectionMoved, this, &CustomTableHeader::HandleSectionMoved);
}
void CustomTableHeader::showEvent(QShowEvent *e)
{
for (int i = 0; i < count(); i++)
{
if (!mItems[i].item)
mItems[i].item = new QWidget(this);
else
mItems[i].item->setParent(this);
mItems[i].item->setGeometry(sectionViewportPosition(i) + mItems[i].margins.left,
mItems[i].margins.top,
sectionSize(i) - mItems[i].margins.left - mItems[i].margins.right - 1,
height() - mItems[i].margins.top - mItems[i].margins.buttom - 1);
mItems[i].item->show();
}
QHeaderView::showEvent(e);
}
void CustomTableHeader::HandleSectionResized(int i)
{
int logical;
for (int j = visualIndex(i); j < count(); j++)
{
logical = logicalIndex(j);
mItems[logical].item->setGeometry(sectionViewportPosition(logical) + mItems[i].margins.left,
mItems[i].margins.top,
sectionSize(logical) - mItems[i].margins.left - mItems[i].margins.right - 1,
height() - mItems[i].margins.top - mItems[i].margins.buttom - 1);
}
}
void CustomTableHeader::HandleSectionMoved(int logical, int oldVisualIndex, int newVisualIndex)
{
Q_UNUSED(logical);
for (int i = qMin(oldVisualIndex, newVisualIndex); i < count(); i++)
{
int logical = logicalIndex(i);
mItems[logical].item->setGeometry(sectionViewportPosition(logical) + mItems[i].margins.left,
mItems[i].margins.top,
sectionSize(logical) - mItems[i].margins.left - mItems[i].margins.right - 1,
height() - mItems[i].margins.top - mItems[i].margins.buttom - 1);
}
}
void CustomTableHeader::FixComboPositions()
{
for (int i = 0; i < count(); i++)
mItems[i].item->setGeometry(sectionViewportPosition(i) + mItems[i].margins.left,
mItems[i].margins.top,
sectionSize(i) - mItems[i].margins.left - mItems[i].margins.right - 1,
height() - mItems[i].margins.top - mItems[i].margins.buttom - 1);
}
void CustomTableHeader::SetItemWidget(int index, QWidget * widget)
{
widget->setParent(this);
mItems[index].item = widget;
}
void CustomTableHeader::SetItemMargins(int index, CustomTableHeader::Margins margins)
{
mItems[index].margins = margins;
}
CustomTableHeader::Margins::Margins(int left, int right, int top, int buttom) :
left(left),
right(right),
top(top),
buttom(buttom)
{
}
CustomTableHeader::Item::Item() :
item(nullptr)
{
}
customheaderedtable.h:
#ifndef CUSTOMHEADEREDTABLE_H
#define CUSTOMHEADEREDTABLE_H
#include <QtCore/qglobal.h>
#include <QTableWidget>
#include "customtableheader.h"
class CustomHeaderedTable : public QTableWidget
{
public:
CustomHeaderedTable(QWidget * parent = Q_NULLPTR);
void scrollContentsBy(int dx, int dy);
void SetHorizontalHeaderItemWidget(int column, QWidget * widget);
void SetHorizontalHeaderItemMargins(int column, CustomTableHeader::Margins margins);
private:
CustomTableHeader * mHorizontalHeader;
};
#endif // CUSTOMHEADEREDTABLE_H
customheaderedtable.cpp:
#include "customheaderedtable.h"
CustomHeaderedTable::CustomHeaderedTable(QWidget * parent) :
QTableWidget(parent)
{
mHorizontalHeader = new CustomTableHeader(Qt::Orientation::Horizontal, this);
setHorizontalHeader(mHorizontalHeader);
}
void CustomHeaderedTable::scrollContentsBy(int dx, int dy)
{
QTableWidget::scrollContentsBy(dx, dy);
if (dx != 0)
mHorizontalHeader->FixComboPositions();
}
void CustomHeaderedTable::SetHorizontalHeaderItemWidget(int column, QWidget * widget)
{
mHorizontalHeader->SetItemWidget(column, widget);
}
void CustomHeaderedTable::SetHorizontalHeaderItemMargins(int column, CustomTableHeader::Margins margins)
{
mHorizontalHeader->SetItemMargins(column, margins);
}
示例用法:
QComboBox * combo = new QComboBox();
combo->addItem("1");
combo->addItem("2");
combo->addItem("3");
CustomHeaderedTable table = new CustomHeaderedTable(this);
table->setRowCount(70);
table->setColumnCount(70);
table->SetHorizontalHeaderItemWidget(1, combo);