C ++ Qt Snippet的等效PyQt代码

时间:2016-06-10 14:48:37

标签: python c++ qt pyqt code-translation

我正在使用PyQt并理解足够的OOP以便在Python中轻松获得。但是,文档和有用的论坛帖子都是用C ++编写的。我知道最好的途径可能就是重新学习C ++。我正在尝试,但是花了很长时间来筛选教程并找到我需要的信息,主要是因为我不太了解术语,知道在哪里看。

在特定论坛post中,类实现的方法中有一节如下:

    void SetTextInteraction(bool on, bool selectAll = false)
{
    if(on && textInteractionFlags() == Qt::NoTextInteraction)
    {
        // switch on editor mode:
        setTextInteractionFlags(Qt::TextEditorInteraction);
        // manually do what a mouse click would do else:
        setFocus(Qt::MouseFocusReason); // this gives the item keyboard focus
        setSelected(true); // this ensures that itemChange() gets called when we click out of the item
        if(selectAll) // option to select the whole text (e.g. after creation of the TextItem)
        {
            QTextCursor c = textCursor();
            c.select(QTextCursor::Document);
            setTextCursor(c);
        }
    }
    else if(!on && textInteractionFlags() == Qt::TextEditorInteraction)
    {
        // turn off editor mode:
        setTextInteractionFlags(Qt::NoTextInteraction);
        // deselect text (else it keeps gray shade):
        QTextCursor c = this->textCursor();
        c.clearSelection();
        this->setTextCursor(c);
        clearFocus();
    }
}

我不明白的部分在这里:

QTextCursor c = textCursor();
c.select(QTextCursor::Document);
setTextCursor(c);

这个特定部分的等效Python代码是什么?出于某种原因,我认为第一行可能是c = QTextCursor.textCursor(),因为textCursor类的方法QTextCursor的结果被分配给c,但似乎有textCursor没有 QTextCursor c = this->textCursor(); c.clearSelection(); this->setTextCursor(c); 方法。我也无法理解这里发生了什么:

sonar.projectKey

对单词中发生的事情的解释将是有用的,因为这将有助于术语位。关于某些资源的建议,以了解这些特定的代码片段也将受到赞赏。

2 个答案:

答案 0 :(得分:2)

原始代码中的

SetTextInteractionQGraphicsTextItem的子类的方法,textCursor()方法继承自QGraphicsTextItem。翻译到PyQt是字面意思:

class TextItem(QGraphicsTextItem):
  def __init__(self, parent=None):
    super(TextItem, self).__init__(parent)

  def test(self):
    c = self.textCursor()
    c.clearSelection()
    self.setTextCursor(c)

在这段代码中,我们使用QGraphicsTextItem::textCursor获取游标对象,修改它并使用QGraphicsTextItem::setTextCursor进行设置以应用更改。

答案 1 :(得分:2)

我的Python和PyQt很生疏,但这里的翻译可能会出现语法上的小错误:

def SetTextInteraction(self, on, selectAll):
    if on and self.textInteractionFlags() == Qt.NoTextInteraction:
        self.setTextInteractionFlags(Qt.TextEditorInteraction)
        self.setFocus(Qt.MouseFocusReason)
        self.setSelected(True) 
        if selectAll:
            c = self.textCursor()
            c.select(QTextCursor.Document)
            self.setTextCursor(c)
    elif not on and self.textInteractionFlags() == Qt.TextEditorInteraction:
        self.setTextInteractionFlags(Qt.NoTextInteraction)
        c = self.textCursor()
        c.clearSelection()
        self.setTextCursor(c)
        self.clearFocus()

有两个原因让您对您链接的代码中发生的事情感到困惑:

  1. C ++在编译时处理隐式范围解析; Python需要显式声明。首先检查局部范围(成员函数),然后是周围的类,然后(我相信)本地翻译单元/本地非成员函数,最后是命名空间/范围层次结构,直到找到被引用的函数或变量。

    textCursorTextItem的父类的成员函数。调用textCursor()与调用this->textCursor()相同,在Python中调用self.textCursor()

  2. 提供的代码将this的显式用法与隐式调用混合使用。在不必要的情况下使用this在C ++中被视为不良形式,并使其看起来好像textCursor()this->textCursor()不同。希望在阅读我提供的Python版本时,您会发现没有任何区别。
  3. 未来资源
    C++ tag与C ++上的常见问题解答有很好的联系。我建议您在C++ Super-FAQ中漫步。你将会学到你并不期望你需要知道的事情,你所知道的事情并不清楚。 SO上还有The Definitive C++ Book Guide and List

    对于PyQt开发,Mark Summerfield的Rapid GUI Programming with Python and Qt是一个很好的工作代码参考。