2012-05-22 48 views
0

我有一个Qt代码在C++中编写。我希望它翻译成Python代码,但是我已经在4号线的一个问题: 所有代码:pyqt QTableView打印(4行C++代码翻译为python)

void TableView::print(QPainter* painter, const QRect& area) 
{ 
    const int rows = model()->rowCount(); 
    const int cols = model()->columnCount(); 

    // calculate the total width/height table would need without scaling 
    double totalWidth = 0.0; 
    for (int c = 0; c < cols; ++c) 
    { 
     totalWidth += columnWidth(c); 
    } 
    double totalHeight = 0.0; 
    for (int r = 0; r < rows; ++r) 
    { 
     totalHeight += rowHeight(r); 
    } 

    // calculate proper scale factors 
    const double scaleX = area.width()/totalWidth; 
    const double scaleY = area.height()/totalHeight; 
    painter->scale(scaleX, scaleY); 

    // paint cells 
    for (int r = 0; r < rows; ++r) 
    { 
     for (int c = 0; c <; cols; ++c) 
     { 
      QModelIndex idx = model()->index(r, c); 
      QStyleOptionViewItem option = viewOptions(); 
      option.rect = visualRect(idx); 
      itemDelegate()->paint(painter, option, idx); 
     } 
    } 
} 

// printer usage 
QPainter painter(&printer); 
tableView->print(&painter, printer.pageRect()); 

// test on pixmap 
QPixmap pixmap(320, 240); 
QPainter painter(&pixmap); 
tableView->print(&painter, pixmap.rect()); 
pixmap.save("table.png", "PNG"); 

,但问题是在这里:

for (int c = 0; c < cols; ++c) 
{ 
    QModelIndex idx = model()->index(r, c); 
    QStyleOptionViewItem option = viewOptions(); 
    option.rect = visualRect(idx); 
    itemDelegate()->paint(painter, option, idx); 
} 

请帮助我。非常感谢你:)

+0

有什么实际问题?它不是在编译?如果没有,编译器错误是什么? – Brady

+0

它正在编译。我想翻译c 2 py。问题到底在这里: –

+0

option.rect = self.visualRect(idx) –

回答

0

这将是很好,如果你解释这个问题。

让我们来看看...

for (int c = 0; c < cols; ++c) 
{ 
    QModelIndex idx = model()->index(r, c); 
    QStyleOptionViewItem option = viewOptions(); 
    option.rect = visualRect(idx); 
    itemDelegate()->paint(painter, option, idx); 
} 

一个直接的翻译是:

for c in range(cols): 
    idx = model.index(r, c) 
    option = self.viewOptions() 
    option.rect = self.visualRect(idx) 
    self.itemDelegate().paint(painter, option, idx) 

不能确定option.rect = ...(没有测试)。有问题吗?

+0

我想将它翻译成python并测试它。但我不明白如何做到这一点 –

+0

所以你没有看到我已经在我的答案翻译它? –

+0

非常感谢你ricardo。它是在你的帮助下解决的:) –

0

C++代码移植到Python是:

def printTable(self,printer,painter,area): 
    model = self.model 
    myTableView = self.view 
    printer = painter #self.myprinter 
    rows = model.rowCount(); 
    columns = model.columnCount(); 
    totalWidth = 0.0; 
    totalPageHeight = 0.0; 
    totalHeight = 0.0; 
    for c in range(columns): 
     totalWidth += myTableView.columnWidth(c) 

    for p in range(45): 
     totalPageHeight += myTableView.rowHeight(p); 

    for r in range(rows): 
     totalHeight += myTableView.rowHeight(r); 

    xscale = area.width()/totalWidth; 
    yscale = area.height()/totalHeight; 
    pscale = area.height()/totalPageHeight; 
    painter.scale(xscale, pscale); 
    painter.translate(area.x() + xscale, area.y() + yscale); 

    x=0 
    #QStyleOptionViewItem option; 

    for r in range(rows): 
     ++x 
     for c in range(columns): 
      idx = model.index(r,c); 
      option = myTableView.viewOptions(); 
      option.rect = myTableView.visualRect(idx); 
      if r % 2 == 0: 
       brush= QtGui.QBrush(QtGui.QColor(220, 220, 220), QtCore.Qt.SolidPattern); 
       painter.fillRect(option.rect, brush); 
      myTableView.itemDelegate().paint(painter, option, idx); 

     if (x == 45): 
      ok = printer.newPage(); 
      x=0; 
      painter.translate(0, -1350);