C++ 打印带有垂直和水平标题的QTableView
我有一个程序(使用QSQLQuery)从SQL获取数据,并将结果放入QTableView 为了便于用户阅读,我需要转换SQL输出(交换行和列),但在SQL中无法轻松实现这一点(即使使用PIVOT)。相反,我在Qt中使用了一个非常有效的代理模型 问题是我需要能够打印整个QTableView。我可以打印带有水平标题的表格内容,但就我的一生而言,我无法确定如何打印垂直标题(技术上是第一列,因为由于换位,每行都有一个标签)。Qt不能识别第一个“列”是行名称的列,我也不知道如何让它作为垂直标题进行打印 代理模型代码:C++ 打印带有垂直和水平标题的QTableView,c++,qt,qt5,qtableview,qprinter,C++,Qt,Qt5,Qtableview,Qprinter,我有一个程序(使用QSQLQuery)从SQL获取数据,并将结果放入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);
}
}
void Snapshot\u finance::在按钮上单击打印()
{
QString html;
html=“”;
对于(int row=0;rowtableView->model()->rowCount();row++){
html+=“”;
对于(int column=0;columntableView->model()->columnCount();
列++){
QString data=ui->tableView->model()->data(ui->tableView->model()->
索引(行、列),Qt::DisplayRole.toString();
html+=“”+数据+“”;
}
html+=“”;
}
html+=“”;
打印机;
QPrintDialog*dialog=新建QPrintDialog(&打印机);
如果(对话框->执行()==QDialog::已接受){
QTextDocument文件;
setHtml(html);
文档。打印(&打印机);
}
}
非常感谢任何帮助或建议 如果要打印标题,必须添加标题,如以下代码所示:
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);
}
}
void Snapshot\u finance::在按钮上单击打印()
常量QString格式(“%1”);
QString html;
qabstractemmodel*md=ui->tableView->model();
html=“”;
html+=“”;
对于(int column=0;columncolumnCount();
列++){
QString data=md->headerData(列,Qt::Horizontal,Qt::DisplayRole);
html+=format.arg(数据);
}
对于(int row=0;rowrowCount();row++){
html+=“”;
QString data=md->headerData(行,Qt::Vertical,Qt::DisplayRole).toString();
html+=format.arg(数据);
对于(int column=0;columncolumnCount();
列++){
QString data=md->index(行、列).data(Qt::DisplayRole).toString();
html+=format.arg(数据);
}
html+=“”;
}
html+=“”;
打印机;
QPrintDialog*dialog=新建QPrintDialog(&打印机);
如果(对话框->执行()==QDialog::已接受){
QTextDocument文件;
setHtml(html);
文档。打印(&打印机);
}
}
TableView:
部分PDF
下面可以找到为测试实现的代码