首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将C++行转换为Python3

将C++行转换为Python3
EN

Stack Overflow用户
提问于 2018-07-06 04:10:58
回答 1查看 179关注 0票数 1

我正在尝试将一个Qt插件从C++翻译成python,但是我对C++的了解很少,你能帮我确认一下我的翻译是否正确吗?(插件没有像预期的那样工作)。

C++代码:

代码语言:javascript
复制
/***************************************************************************
 *   Copyright (C) 2006-2008 by Tomasz Ziobrowski                          *
 *   http://www.3electrons.com                                             *
 *   e-mail: t.ziobrowski@3electrons.com                                   *
 *                                                                         *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include <QPainter>
#include <QPen>
#include <QSvgRenderer>
#include "counter.h"


Counter::Counter (QWidget * parent):QWidget(parent)
{
  init();
}

int Counter::digits() const
{
  return m_digits;
}

int Counter::value() const
{
  return m_value;
}

const QString Counter::digitsFile() const
{
  return m_digitsFile;
}

/*--------------------------------------------------------------------------------------------
                  P U B L I C   S L O T S
--------------------------------------------------------------------------------------------*/
void Counter::setValue(int i)
{
   m_value = i;
   update();
}

void Counter::setDigits(int i)
{
  m_digits = i;
  update();
}

void Counter::setDigitsFile(const QString & i )
{
   m_digitsFile = i;
   if (m_svg)
     delete m_svg;
   m_svg = new QSvgRenderer(this);
   if (!m_svg->load(m_digitsFile))
   {
     qDebug("Counter::setDigitsFile can't load file %s",qPrintable(m_digitsFile));
     m_digitsFile = ":/default/resources/train_digits.svg";
     m_svg->load(m_digitsFile);

   }
   else
    qDebug("Counter::setDigitsFile %s loaded",qPrintable(m_digitsFile));

  update();
}

/*--------------------------------------------------------------------------------------------
                  P R O T E C T E D
--------------------------------------------------------------------------------------------*/
#define X_OFFSET 10
#define Y_OFFSET 10

void Counter::paintEvent (QPaintEvent *)
{
  QPainter p(this);
  p.setRenderHint(QPainter::Antialiasing,true);

  p.save();
  int side = this->height();
  p.scale(side/100.0,side/100.0);

  double width = 100.0 * this->width()/this->height(), height = 100.0;


  //p.setPen(Qt::NoPen);
  QPen pen = p.pen();

  pen.setColor(QColor(32,32,32));
  pen.setWidthF(6.0);
  p.setPen(pen);
  p.setBrush(Qt::black);
  p.drawRoundRect(3,3,width-6,height-6,7,(7*width)/(double)height);


  int w = (width-2*X_OFFSET)/m_digits;
  int x = (m_digits-1) * w;
  int h = height-2*Y_OFFSET;
  int r, c = m_value;

    for (int i=0 ; i<m_digits ; i++)
    {
      r = c % 10;
      c = c/10;
      QRect rect(x+X_OFFSET,Y_OFFSET,w,h);
      m_svg->render(&p,QString("d%1").arg(r),rect);
      x -= w;
    }
  p.restore();
}


void Counter::init()
{
   Q_INIT_RESOURCE(analogwidgets);
   m_digits = 4;
   m_value = 0;
   m_svg = NULL;
   setDigitsFile(":/default/resources/train_digits.svg");
}

我的Python翻译:

代码语言:javascript
复制
from PyQt5.QtGui import QPainter, QPen, QColor
from PyQt5.QtSvg import QSvgRenderer
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QWidget
import sys
import os

class PyCounter(QWidget):
    def __init__(self, parent = None):
        super(PyCounter, self).__init__(parent)

        self.inicio()

    def getDigits(self):
        return self.m_digits

    def getValue(self):
        return self.m_value

    def getDigitsfile(self):
        return self.m_digitsFile

    def setValue(self, val):
        self.m_value = val
        self.update()

    def setDigits(self, dit):
        self.m_digits = dit
        self.update()

    def setDigitsFile(self, filemon):
        self.m_digitsFile = filemon
        if self.m_svg == True:
            del self.m_svg
        self.m_svg = QSvgRenderer(self)
        if self.m_svg.load(self.m_digitsFile) == False:
            print("Cannot load resource File")
            self.m_digitsFile = ":/default/resources/train_digits.svg"
            self.m_svg.load(self.m_digitsFile)
        else:
            print("Train digits correctly loaded")
        self.update()

    X_OFFSET = 10
    Y_OFFSET = 10

    def paintEvent(self, event):
        p = QPainter(self)
        p.setRenderHint(QPainter.Antialiasing)
        p.save()

        side = self.height()
        p.scale(side/100.0, side/100.0)
        width = 100 * self.width()
        height = 100 * self.height()

        pen = QPen(p.pen())

        pen.setColor(QColor(32,32,32))
        pen.setWidthF(6.0)
        p.setPen(pen)
        p.setBrush(Qt.black)
        p.drawRoundedRect(3,3,width-6,height-6,7,(7*width)/height)

        w = (width - 2*(10))/self.m_digits
        x = (self.m_digits-1) * w
        h = height-2*10
        c = self.m_value
        r = 0

        y = 0
        while y < self.m_digits:
            y += 1
            r = c % 10
            c = c/10
            rect = QRectF(x + 10, 10, w, h)
            self.m_svg.render(p, str("d%1").format(r), rect)
            x -= w

        p.restore()

    def inicio(self):
        import AnalogWidgets_rc
        self.m_value = 0
        self.m_digits = 4
        self.m_svg = None
        self.setDigitsFile(":/default/resources/train_digits.svg")

我的疑问特别是在C++代码的第69行,其中写道:

代码语言:javascript
复制
m_svg = new QSvgRenderer(this);

我不知道如何准确地翻译这个,那个“新的”让我觉得我做错了,检查我的翻译:

代码语言:javascript
复制
self.m_svg = QSvgRenderer(self)

没有按预期工作的是SVG负载。

编辑:

小部件如下所示:

PyCounter

AnalogWidgets_rc.py:

https://pastebin.com/Ck0VX6eG

该文件是使用pyrcc5工具生成的

原始analogwidgets.qrc:

代码语言:javascript
复制
<RCC>
    <qresource prefix="/default" >
        <file>resources/train_digits.svg</file>
        <file>resources/dial1.svg</file>
        <file>resources/dial2.svg</file>
        <file>resources/dial3.svg</file>
        <file>resources/dial4.svg</file>
    </qresource>
</RCC>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-06 04:36:29

我发现问题出在下面这行:

代码语言:javascript
复制
self.m_svg.render(p, str("d%1").format(r), rect)

QString使用%1来完成数据,如果是python,则使用format时必须使用{}

代码语言:javascript
复制
self.m_svg.render(p, "d{}".format(r), rect)

在以下link中,您可以找到完整的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51199137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档