2014-11-18 42 views
0

Можно ли отобразить пользовательский QWidget на QHeaderView вместо простой строки?Добавить пользовательские виджеты как QTableWidget HorizontalHeader

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

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

Если я правильно понимаю вашу проблему, у вас есть длинный ярлык заголовка, который не является фитинг в ширину столбцов, это правильно? – fecub

+0

Ну, это больше похоже на то, что я хочу увеличить высоту элемента заголовка, а не ширины. – BurninatorDor

ответ

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

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

1

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

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

Окончание Я нашел этот пост в блоге: 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); 
} 

Образец Useage:

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