C++ Qt Snippet 的等效 PyQt 代码
Equivalent PyQt code for C++ Qt Snippet
我正在使用 PyQt 并了解足够的 OOP 以在 Python 中轻松度过难关。但是,文档和有用的论坛帖子都是用 C++ 编写的。我知道最好的方法可能是重新学习 C++。我正在尝试,但是筛选教程并找到我需要的信息需要很长时间,主要是因为我对术语的理解不够,不知道去哪里看。
在特定的论坛 post 中有一个 class 实现方法的部分内容如下:
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 代码是什么?出于某种原因,我认为来自 QTextCursor
class 的方法 textCursor
的结果中的第一行可能是 c = QTextCursor.textCursor()
被分配给 c
,但它似乎没有 textCursor
方法。我也无法理解这里发生了什么:
QTextCursor c = this->textCursor();
c.clearSelection();
this->setTextCursor(c);
用文字解释正在发生的事情会很有用,因为这有助于术语位。还可以推荐一些资源来理解这些特定的代码片段。
原代码中的SetTextInteraction
是QGraphicsTextItem
子类的一个方法,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
设置它以应用更改。
我的 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()
您对链接到的代码中发生的事情感到困惑的原因有两个:
C++ 在编译时处理隐式作用域解析; Python 需要显式声明。首先检查局部作用域(成员函数),然后是周围的 class,然后(我相信)局部翻译 unit/local 非成员函数,最后向上 namespace/scope 层次结构直到它找到被引用的函数或变量。
textCursor
是 TextItem
的父 class 的成员函数。调用 textCursor()
与调用 this->textCursor()
相同,在 Python 中将是 self.textCursor()
.
提供的代码将 this
的显式用法与隐式调用混合在一起。在 C++ 中,在不必要的地方使用 this
被认为是错误的形式,并使其看起来好像 textCursor()
与 this->textCursor()
不同。希望在阅读我提供的 Python 版本时,您会发现两者没有区别。
未来资源
SO 上的 C++ tag has great links to FAQs on C++. I recommend a stroll through the C++ Super-FAQ. You'll learn things you didn't expect you needed to know and things you didn't know were not clear will be clarified. There is also The Definitive C++ Book Guide and List。
对于 PyQt 开发,Mark Summerfield 的 Rapid GUI Programming with Python and Qt 是一个很好的工作代码参考。
我正在使用 PyQt 并了解足够的 OOP 以在 Python 中轻松度过难关。但是,文档和有用的论坛帖子都是用 C++ 编写的。我知道最好的方法可能是重新学习 C++。我正在尝试,但是筛选教程并找到我需要的信息需要很长时间,主要是因为我对术语的理解不够,不知道去哪里看。
在特定的论坛 post 中有一个 class 实现方法的部分内容如下:
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 代码是什么?出于某种原因,我认为来自 QTextCursor
class 的方法 textCursor
的结果中的第一行可能是 c = QTextCursor.textCursor()
被分配给 c
,但它似乎没有 textCursor
方法。我也无法理解这里发生了什么:
QTextCursor c = this->textCursor();
c.clearSelection();
this->setTextCursor(c);
用文字解释正在发生的事情会很有用,因为这有助于术语位。还可以推荐一些资源来理解这些特定的代码片段。
SetTextInteraction
是QGraphicsTextItem
子类的一个方法,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
设置它以应用更改。
我的 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()
您对链接到的代码中发生的事情感到困惑的原因有两个:
C++ 在编译时处理隐式作用域解析; Python 需要显式声明。首先检查局部作用域(成员函数),然后是周围的 class,然后(我相信)局部翻译 unit/local 非成员函数,最后向上 namespace/scope 层次结构直到它找到被引用的函数或变量。
textCursor
是TextItem
的父 class 的成员函数。调用textCursor()
与调用this->textCursor()
相同,在 Python 中将是self.textCursor()
.提供的代码将
this
的显式用法与隐式调用混合在一起。在 C++ 中,在不必要的地方使用this
被认为是错误的形式,并使其看起来好像textCursor()
与this->textCursor()
不同。希望在阅读我提供的 Python 版本时,您会发现两者没有区别。
未来资源
SO 上的 C++ tag has great links to FAQs on C++. I recommend a stroll through the C++ Super-FAQ. You'll learn things you didn't expect you needed to know and things you didn't know were not clear will be clarified. There is also The Definitive C++ Book Guide and List。
对于 PyQt 开发,Mark Summerfield 的 Rapid GUI Programming with Python and Qt 是一个很好的工作代码参考。