Печать QTableView с вертикальными и горизонтальными заголовками - PullRequest
0 голосов
/ 06 мая 2018

У меня есть программа, которая получает данные из SQL (используя QSQLQuery) и помещает результат в QTableView.

Для удобства чтения пользователю нужно было транспонировать выходные данные SQL (поменять местами строки и столбцы), но я не смог легко добиться этого в SQL (даже используя PIVOT). Вместо этого я использовал прокси-модель в Qt, которая прекрасно работает.

Проблема в том, что мне нужно иметь возможность распечатать весь QTableView. Я могу напечатать содержимое таблицы с горизонтальными заголовками, но на всю жизнь не могу понять, как печатать вертикальные заголовки (технически первый столбец, поскольку каждая строка имеет метку из-за транспонирования). Qt не распознает первый столбец как столбец имен строк, и я не знаю, как заставить его воспринимать его как вертикальные заголовки для печати.

Код модели прокси:

class Horizontal_proxy_model : public QAbstractProxyModel {
public:
 Horizontal_proxy_model(QObject * parent = 0);
QModelIndex mapToSource(const QModelIndex &proxyIndex) const;
QModelIndex mapFromSource(const QModelIndex &sourceIndex) const;
QModelIndex index(int row, int column, const QModelIndex &parent = 
QModelIndex()) const;
QModelIndex parent(const QModelIndex &child) const;
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) 
const;
};

Horizontal_proxy_model::Horizontal_proxy_model(QObject *parent) :
QAbstractProxyModel(parent) {
}

QModelIndex Horizontal_proxy_model::mapToSource(const QModelIndex 
&proxyIndex) const {
if (sourceModel()) {
  return sourceModel()->index(proxyIndex.column(), proxyIndex.row());
} else {
 return QModelIndex();
}
}

 QModelIndex Horizontal_proxy_model::mapFromSource(const QModelIndex 
 &sourceIndex) const {
 return index(sourceIndex.column(), sourceIndex.row());
 }

 QModelIndex Horizontal_proxy_model::index(int row, int column, const 
 QModelIndex &) const {
 return createIndex(row, column, (void*) 0);
 }

 QModelIndex Horizontal_proxy_model::parent(const QModelIndex &) const {
 return QModelIndex();
 }

 int Horizontal_proxy_model::rowCount(const QModelIndex &) const {
 return sourceModel() ? sourceModel()->columnCount() : 0;
 }

int Horizontal_proxy_model::columnCount(const QModelIndex &) const {
return sourceModel() ? sourceModel()->rowCount() : 0;
}

QVariant Horizontal_proxy_model::headerData(
       int section, Qt::Orientation orientation, int role) const {
 if (!sourceModel()) { return QVariant(); }
 Qt::Orientation new_orientation = orientation == Qt::Horizontal ?
  Qt::Vertical : Qt::Horizontal;
 return sourceModel()->headerData(section, new_orientation, role);
 }

Вот основы того, как я пытаюсь печатать;

void Snapshot_finance::on_pushButton_print_clicked()
{
QString html;
html = "<html><body><table border=\"0\">";
for(int row = 0; row < ui->tableView->model()->rowCount(); row++) {
  html += "<tr>";
  for(int column = 0; column < ui->tableView->model()->columnCount(); 
column++) {
QString data = ui->tableView->model()->data(ui->tableView->model()-> 
index(row, column), Qt::DisplayRole).toString();
    html += "<td>" + data + "</td>";
  }
  html += "</tr>";
}
html += "</table></body></html>";

QPrinter printer;
QPrintDialog *dialog = new QPrintDialog(&printer);
if(dialog->exec() == QDialog::Accepted) {
  QTextDocument document;
  document.setHtml(html);
  document.print(&printer);
}
}

Действительно ценю любую помощь или совет!

1 Ответ

0 голосов
/ 06 мая 2018

Если вы хотите напечатать заголовки, вы должны добавить их, как показано в следующем коде:

void Snapshot_finance::on_pushButton_print_clicked()
    const QString format("<td>%1</td>");
    QString html;
    QAbstractItemModel *md = ui->tableView->model();
    html = "<html><body><table border=\"0\">";

    html += "<td></td>";
    for(int column = 0; column < md->columnCount();
        column++) {
        QString data = md->headerData(column, Qt::Horizontal, Qt::DisplayRole).toString();
        html += format.arg(data);
    }
    for(int row = 0; row < md->rowCount() ; row++) {
        html += "<tr>";
        QString data = md->headerData(row, Qt::Vertical, Qt::DisplayRole).toString();
        html += format.arg(data);
        for(int column = 0; column < md->columnCount();
            column++) {
            QString data = md->index(row, column).data(Qt::DisplayRole).toString();
            html += format.arg(data);
        }
        html += "</tr>";
    }
    html += "</table></body></html>";

    QPrinter printer;
    QPrintDialog *dialog = new QPrintDialog(&printer);
    if(dialog->exec() == QDialog::Accepted) {
        QTextDocument document;
        document.setHtml(html);
        document.print(&printer);
    }
}

TableView:

enter image description here

Часть PDF

enter image description here

Код, реализованный для теста, можно найти по следующей ссылке .

...