#include struct Comment { Comment(const QString& title_, const QString& comment_) : title(title_), comment(comment_) { } QString title; QString comment; }; class CommentModel : public QAbstractTableModel { public: CommentModel(const std::vector &texts, QWidget *parent = nullptr) : QAbstractTableModel(parent) , _text(texts) {} int columnCount(const QModelIndex & = {}) const override { return 2; } int rowCount(const QModelIndex & = {}) const override { return static_cast( _text.size() * 2); } QVariant data(const QModelIndex& idx, int role = Qt::DisplayRole) const override { if(role == Qt::DisplayRole) { const auto& comment = _text[idx.row() / 2]; if(idx.row() % 2 == 0) { if(idx.column() == 0) return comment.title; if(idx.column() == 1) return "Placeholder"; } else { if(idx.column() == 0) return comment.comment; } } return QVariant(); } private: std::vector _text; }; int main(int argc, char *argv[]) { QApplication a(argc, argv); QTableView table; CommentModel model({Comment("comment 1", "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."), Comment("comment 2", "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat."), Comment("comment 3", "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat" "non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."), Comment("comment 4", "Platea dictumst quisque sagittis purus sit amet volutpat. Libero id faucibus nisl tincidunt eget nullam."), Comment("comment 5", "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.")}, &table); table.setModel(&model); for (int r = 1; r < model.rowCount(); r +=2) table.setSpan(r, 0, 1, 2); table.show(); return a.exec(); }