C++ QTableWidget:作为标题的个人小部件?

C++ QTableWidget:作为标题的个人小部件?,c++,qt,qwidget,qtablewidget,C++,Qt,Qwidget,Qtablewidget,将personnal小部件(在我的例子中是一组QPixmap+QLabel+QComboBox)作为QTableWidget中的标题,最简单的方法是什么(如果可能的话,不将QTableWidget子类化) 对数组内容执行此操作相对容易,因为我们有函数QTableWidget::setCellWidget(int行,int列,QWidget*widget),但对于标题,我们只有QTableWidget::setHorizontalHeaderItem(int列,QTableWidgetItem*i

将personnal小部件(在我的例子中是一组QPixmap+QLabel+QComboBox)作为QTableWidget中的标题,最简单的方法是什么(如果可能的话,不将QTableWidget子类化)

对数组内容执行此操作相对容易,因为我们有函数
QTableWidget::setCellWidget(int行,int列,QWidget*widget)
,但对于标题,我们只有
QTableWidget::setHorizontalHeaderItem(int列,QTableWidgetItem*item)

多谢各位

编辑: 也许我找到了一个非常不公平的方法来做这件事:

1) 我用一个空的QString头初始化每个列

2) 我使用
\u table->horizontalHeader()->sectionPosition(index)
\u table->horizontalHeader()->sectionSize(index)

3) 然后我在每个部分上画一个QFrame,留一点空白

4) 最后,我在这些QFrame中加载我的QWidget


如果其他人有更好的解决方案,我很感兴趣……

我想
setCellWidget()
会完成这项工作。我看没有更容易的办法了。如果不使用QFrame的附加功能,您也可以使用QWidget来代替QFrame

为了创建一个类似excel的过滤器标题,我做了很多研究

更换收割台既不简单也不快速

最后我找到了这篇博文:。根据指南,以下是创建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
样本使用:

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);

为什么不写MyHeader:PublicQWidget,PublicQtableWidgetItem?像通常的小部件一样构造小部件,然后在标题中使用。
#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
#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);