QT += coreTARGET = testTableTEMPLATE = appDESTDIR = ../SOURCES += ./source/main.cpp \ ./source/testTable.cpp HEADERS += ./include/testTable.h FORMS += ./ui/testTable.uiINCLUDEPATH += ./include/INCLUDEPATH += ./tmp/release/moc \ ./tmp/release/uic \ ./tmp/release/rccMOC_DIR += ./tmp/release/mocOBJECTS_DIR += ./tmp/release/objecsUI_DIR += ./tmp/release/uicRCC_DIR += ./tmp/release/rcc
<?xml version="1.0" encoding="UTF-8"?><ui version="4.0"> <class>testTable</class> <widget class="QMainWindow" name="testTable"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>650</width> <height>428</height> </rect> </property> <property name="windowTitle"> <string>Тестирование таблицы</string> </property> <widget class="QWidget" name="centralwidget"> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QTableWidget" name="tableWidget"/> </item> </layout> </widget> <widget class="QMenuBar" name="menubar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>650</width> <height>21</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/></ui>
#include "testTable.h"#include <QTextCodec>#include <QTranslator>int main(int argc, char* argv[]) { // UNICODE QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QApplication app(argc, argv); QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(),"./translations"); app.installTranslator(&qtTranslator); CTestTable ctrlWindow; ctrlWindow.show(); return app.exec();}
#ifndef TEST_TABLE_H_21_08_2019_11_49#define TEST_TABLE_H_21_08_2019_11_49#include "ui_testTable.h"#include <QStandardItemModel>class CDataHeaderView: public QHeaderView{ Q_OBJECTpublic: CDataHeaderView(QWidget* pParent); ~CDataHeaderView();protected: virtual QSize sizeHint() const; virtual void paintSection(QPainter* pPainter,const QRect& rect,int logicalIndex) const;private: QStandardItemModel m_headerModel; int m_rowCount;};class CTestTable:public QMainWindow, public Ui::testTable{ Q_OBJECTpublic: CTestTable(); ~CTestTable();};#endif // TEST_TABLE_H_21_08_2019_11_49
#include "testTable.h"#include <QPainter>CDataHeaderView::CDataHeaderView(QWidget* pParent):QHeaderView(Qt::Horizontal,pParent),m_headerModel(this){ m_rowCount=2;//пока без вычислений просто задаю две строки //Формирую сложный столбец QStandardItem* pItem=new QStandardItem(tr("Период")); QList<QStandardItem*> col; col.append(new QStandardItem(tr("Начало"))); col.append(new QStandardItem(tr("Конец"))); pItem->appendRow(col);//Добавил два подстолбца QList<QStandardItem*> columns; columns.append(pItem);//Сложный столбец в общую строку //Далее несколько формальных столбцов columns.append(new QStandardItem("Второй")); columns.append(new QStandardItem("Третий")); columns.append(new QStandardItem("Четвертый")); m_headerModel.appendRow(columns);//Добавляю строку в модель setModel(&m_headerModel);//Устанавливаю модель для CDataHeaderView}CDataHeaderView::~CDataHeaderView(){}QSize CDataHeaderView::sizeHint() const{ QSize size=QHeaderView::sizeHint(); size.rheight()*=m_rowCount; return size;}void CDataHeaderView::paintSection(QPainter* pPainter,const QRect& rect,int logicalIndex) const{ //Пока, для появления ощущений, рисую прямоугольник и вывожу тест QStandardItem* pItem=m_headerModel.item(0,logicalIndex); pPainter->drawRect(rect); pPainter->drawText(rect,Qt::AlignHCenter|Qt::AlignVCenter,QString("%1").arg(pItem->text()));}CTestTable::CTestTable():QMainWindow(NULL){ setupUi(this); //Устанавливаю горизонтальный заголовок для таблицы tableWidget->setHorizontalHeader(new CDataHeaderView(tableWidget));}CTestTable::~CTestTable(){ }
CDataHeaderView::CDataHeaderView(QWidget* pParent):QHeaderView(Qt::Horizontal,pParent),m_headerModel(this){ m_rowCount=2;//пока без вычислений просто задаю две строки //Формирую сложный столбец QStandardItem* pItem=new QStandardItem(tr("Период")); QList<QStandardItem*> col; col.append(new QStandardItem(tr("Начало"))); col.append(new QStandardItem(tr("Конец"))); pItem->appendRow(col);//Добавил два подстолбца QList<QStandardItem*> columns; columns.append(pItem);//Сложный столбец в общую строку [color=red]//Искусственно добавляю еще один столбец pItem=new QStandardItem(tr("без имени"));//дополнительный столбец QVariant data(-1);//и пока "костыльно" его помечаю pItem->setData(data); columns.append(pItem);[/color] //Далее несколько формальных столбцов columns.append(new QStandardItem("Второй")); columns.append(new QStandardItem("Третий")); columns.append(new QStandardItem("Четвертый")); m_headerModel.appendRow(columns);//Добавляю строку в модель setModel(&m_headerModel);//Устанавливаю модель для CDataHeaderView}
void CDataHeaderView::paintSection(QPainter* pPainter,const QRect& rect,int logicalIndex) const{ QStandardItem* pItem=m_headerModel.item(0,logicalIndex); //Теперь начинаю разбирать новости int colCount=pItem->columnCount();//ловлю элементы с вложенными колонками QRect rc=rect; if(colCount)//знаю про первую сложную колонку { int w=sectionSize(1);//индекс пока в тупую 1 rc.setWidth(rc.width()+w); rc.setHeight(QHeaderView::sizeHint().height()); } QVariant data=pItem->data(); if(!data.isNull())//пока вот так ловлю "костыль" { return;//и ничего тут не рисую } pPainter->drawRect(rc); pPainter->drawText(rc,Qt::AlignHCenter|Qt::AlignVCenter,QString("%1").arg(pItem->text()));}