2015-02-25 5 views
4

Я знаю, как установить текстовые метки в заголовки строк или столбцов. Но я хочу сделать что-то вроде этого:Qt Table widget. Как установить значение/заголовок для вертикального заголовка и горизонтального заголовка вместе?

http://i.stack.imgur.com/eMM6U.jpg

я не найти любую информацию о том, как сделать вещь внутри красной окружности. Я начинаю верить, что это невозможно сделать с QTableWidget.

Спасибо;)

ответ

2

Я думаю, что невозможно со стандартными заголовками (QHeaderView) because of:

Примечание: Каждый заголовок предоставляет данные для самой каждой секции, и не не полагаться на делегировать. В результате вызов функцииsetItemDelegate() заголовка не будет иметь никакого эффекта.

Поэтому вам нужно забыть об этом и отключить его, вы должны реализовать свои собственные заголовки (установить цвет, текст и т. Д.), Но я, конечно, помогу со значением/названием. Я достиг этого с следующим делегатом элемента:

.h:

#ifndef ITEMDELEGATEPAINT_H 
#define ITEMDELEGATEPAINT_H 

#include <QStyledItemDelegate> 

class ItemDelegatePaint : public QStyledItemDelegate 
{ 
    Q_OBJECT 
public: 
    explicit ItemDelegatePaint(QObject *parent = 0); 
    ItemDelegatePaint(const QString &txt, QObject *parent = 0); 


protected: 
    void paint(QPainter *painter, 
       const QStyleOptionViewItem &option, 
       const QModelIndex &index) const; 
    QSize sizeHint(const QStyleOptionViewItem &option, 
        const QModelIndex &index) const; 
    QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; 
    void setEditorData(QWidget * editor, const QModelIndex & index) const; 
    void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const; 
    void updateEditorGeometry(QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index) const; 

signals: 

public slots: 

}; 

#endif // ITEMDELEGATEPAINT_H 

Но все это метод не очень полезен здесь, вы можете реализовать его самостоятельно с некоторыми конкретными действиями, я покажу вам основной метод - краски()

void ItemDelegatePaint::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 
    if(index.row() == 0 && index.column() == 0) 
    { 
     QRect source1 = QRect(option.rect.topLeft(),option.rect.size()/2); 
     QRect source2 = QRect(option.rect.topLeft(),option.rect.size()/2); 

     painter->drawLine(option.rect.topLeft(),option.rect.bottomRight()); 

     source1.moveTopLeft(source1.topLeft() += QPoint(source1.size().width(),0)); 
     painter->drawText(source1,"agent reagent"); 

     source2.moveBottomLeft(source2.bottomLeft() += QPoint(0,source2.size().height())); 
     painter->drawText(source2,"hallide ion"); 
    } 

    else 
    { 
     QStyledItemDelegate::paint(painter,option,index); 
    } 
} 

Этот код показывает основную идею, и это не окончательная версия, но вы должны выполнять все эти конкретные действия самостоятельно. Конечно, этот подход не очень прост, вы можете просто создать изображение и установить его в ячейку, но в этом случае изображение не будет хорошим масштабируемым. Мой код работает нормально, если пользователь изменит размер заголовков. Чтобы доказать это, см. Скриншоты разных размеров.

enter image description here

enter image description here

+0

Спасибо;). Я думал, что может быть какой-то тривиальный способ сделать это со стандартным заголовком, который я не знаю. Я понял вашу проблему с круговым движением. Теперь я думаю, стоит ли писать столько кода для создания собственных заголовков, чтобы показать это простое значение заголовка. –

+0

это решение для QTableView работает также в QTableWidget: http://stackoverflow.com/questions/22635867/is-it-possible-to-set-the-text-of-the-qtableview-corner-button –

1

если текстовые элементы, как показано здесь

textelements in cornerButton

достаточно, это может быть сделано с помощью стандартного заголовка и раствора из ссылки я отвечал в мой комментарий :

from PyQt5 import QtCore, QtWidgets 

class MyTableWidget(QtWidgets.QTableWidget): 
    def __init__(self, parent = None): 
     QtWidgets.QTableWidget.__init__(self, parent) 
     self.setRowCount(4) 
     self.setColumnCount(5) 
     self.items = [] 
     self.items.append(['white ppt','no reaction', 'no reaction', 'no reaction', 'no reaction']) 
     self.items.append(['no reaction','white ppt', 'dissolves', 'dissolves', 'no reaction']) 
     self.items.append(['no reaction','pale yellow\nprecipitate', 'dissolves\npartly', 'dissolves', 'no reaction']) 
     self.items.append(['no reaction','yellow ppt', 'does not\ndissolve', 'does not\ndissolve', 'turns\nblue']) 
     self.horizontalHeader().setFixedHeight(90) 
     self.verticalHeader().setFixedWidth(120) 
     self.hh = ['Ca(NO\u2083)\u2082', 'AgNO\u2083','AgNO\u2083\n+\nNH\u2083','AgNO\u2083\n+\nNa\u2083S\u2082O\u2083','Starch\n+\nNaOCl'] 
     self.vh = ['NaF', 'NaCl', 'NaBr or KBR', 'NaJ'] 

     self.addItems() 
     self.addHeaderItems() 
     # text in cornerButton 
     btnTxt = '{: >15}\n{: >19}\n{:<}\n{:<}'.format('reagent', '\u21D2','halide', 'ion \u21D3') 

     # add cornerbutton from http://stackoverflow.com/questions/22635867/is-it-possible-to-set-the-text-of-the-qtableview-corner-button 
     btn = self.findChild(QtWidgets.QAbstractButton) 
     btn.setText(btnTxt) 
     btn.installEventFilter(self) 

     opt = QtWidgets.QStyleOptionHeader() 
     opt.text = btn.text()  
     # end cornerbutton 

    def addItems(self): 
     for r in range(0,len(self.items)): 
      for c in range(0,len(self.items[r])): 
       item = QtWidgets.QTableWidgetItem() 
       item.setText(self.items[r][c]) 
       self.setItem(r,c,item) 

    def addHeaderItems(self): 
     for i in range(0,len(self.hh)): 
      item = QtWidgets.QTableWidgetItem() 
      item.setText(self.hh[i]) 
      self.setHorizontalHeaderItem(i,item) 
      self.setColumnWidth(i,150) 
     for i in range(0,len(self.vh)): 
      item = QtWidgets.QTableWidgetItem() 
      item.setText(self.vh[i]) 
      self.setVerticalHeaderItem(i,item) 
      self.setRowHeight(i,60) 

     # eventfilter from http://stackoverflow.com/questions/22635867/is-it-possible-to-set-the-text-of-the-qtableview-corner-button 
    def eventFilter(self, obj, event): 
     if event.type() != QtCore.QEvent.Paint or not isinstance(
      obj, QtWidgets.QAbstractButton): 
      return False 

     # Paint by hand (borrowed from QTableCornerButton) 
     opt = QtWidgets.QStyleOptionHeader() 
     opt.initFrom(obj) 
     styleState = QtWidgets.QStyle.State_None 
     if obj.isEnabled(): 
      styleState |= QtWidgets.QStyle.State_Enabled 
     if obj.isActiveWindow(): 
      styleState |= QtWidgets.QStyle.State_Active 
     if obj.isDown(): 
      styleState |= QtWidgets.QStyle.State_Sunken 
     opt.state = styleState 
     opt.rect = obj.rect() 
     # This line is the only difference to QTableCornerButton 
     opt.text = obj.text() 
     opt.position = QtWidgets.QStyleOptionHeader.OnlyOneSection 
     painter = QtWidgets.QStylePainter(obj) 
     painter.drawControl(QtWidgets.QStyle.CE_Header, opt) 

     return True 

если painter.drawControl() -method заменяется любым другим painter.draw...() -мерными элементами, вкл. графику можно нарисовать на cornerButton.

+0

Спасибо за ваш ответ. Я понял, что вы сказали, но для моей работы я думаю, что это решение немного переборщило, и пока я иду другим путем. –

+0

ОК. Мне понравилось следить за вашим вопросом и добавить, как рисовать диагональную линию. –