Добавить пользовательские виджеты как QTableWidget HorizontalHeader

Можно ли отобразить кастом QWidget на QHeaderView вместо обычной строки?

Кроме того, возможно ли изменить высоту horizontalHeaderItem только? Он падает, когда я делаю это:

(ui->myTable->horizontalHeaderItem(0))->setSizeHint(QSize(200,300));

0

Решение

Я много исследовал, чтобы создать Excel как заголовок фильтра.

Замена заголовка не имеет простого и быстрого способа.

Наконец, я нашел это сообщение в блоге: Еженедельная поддержка Qt # 27 — виджеты в шапке. На основе этого руководства приведен полный код для создания подкласса 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);
1

Другие решения

О первом вопросе:
Вы можете использовать setIndexWidget для QHeaderView. Но я думаю, что для этой цели вы должны использовать пользовательские QTableView и QHeaderView.
О вашем втором вопросе:
Прежде чем использовать horizontalHeaderItem (0), вы должны создать и установить этот элемент: setHor horizontalHeaderItem (0, new QTableWidgetItem («Test»));

0

Я решил это, добавив заголовки программно в моем .cpp файл, а не в файле дизайна.

QTableWidgetItem *header1 = new QTableWidgetItem("Title of Header 1");
header1->setBackgroundColor(QColor(81,81,81));
header1->setIcon(QIcon(QPixmap(":/images/header1Icon.png")));
header1->setSizeHint(QSize(450,35));
ui->myTable->setHorizontalHeaderItem(0, header1);
0
По вопросам рекламы [email protected]