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

0

Возможно ли отображать пользовательский QWidget в QHeaderView вместо общей строки?

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

(ui->myTable->horizontalHeaderItem(0))->setSizeHint(QSize(200,300));
  • 0
    Если я понимаю вашу проблему, у вас есть длинная метка заголовка, которая не помещается в ширину столбца, верно?
  • 0
    Ну, это больше похоже на то, что я хочу увеличить высоту элемента заголовка, а не ширину.
Теги:
qt
qt5
qheaderview
qtablewidget

3 ответа

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

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

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

Finaly Я нашел это сообщение в блоге: Qt Support Weekly # 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);
0

О первом вопросе: вы можете использовать setIndexWidget для QHeaderView. Но я думаю, для этого вам следует использовать пользовательские QTableView и QHeaderView. О вашем втором вопросе: перед использованием horizontalHeaderItem (0) вы должны создать и установить этот элемент: setHorizontalHeaderItem (0, новый QTableWidgetItem ("Тест"));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню