Python — Эквивалентный код PyQt для С ++ Qt Snippet

Я использую PyQt и понимаю достаточно ООП, чтобы комфортно жить в Python. Тем не менее, документация и полезные сообщения на форуме все на C ++. Я знаю, что лучшим способом было бы просто заново изучить C ++. Я пытаюсь, но это занимает много времени, чтобы просмотреть учебники и найти нужную мне информацию, в основном потому, что я недостаточно понимаю терминологию, чтобы знать, где искать.

На конкретном форуме сообщение в методе реализации класса есть раздел, который гласит:

    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);

Было бы полезно объяснить, что происходит на словах, так как это поможет с терминологией. Также была бы признательна за рекомендацию о некоторых ресурсах, которые нужно изучить, чтобы понять эти конкретные фрагменты кода.

3

Решение

Мой 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 требует явных объявлений. Сначала проверяется локальная область (функция-член), затем окружающий класс, затем (я полагаю) локальная единица перевода / локальные функции, не являющиеся членами, и, наконец, иерархия пространства имен / области, пока не будет найдена функция или переменная, на которую ссылаются.

    textCursor является функцией-членом родительского класса для TextItem, призвание textCursor() так же, как звонить this->textCursor(), который в Python будет self.textCursor(),

  2. Предоставленный код смешивает явное использование this с неявными вызовами. С помощью this там, где это не нужно, считается плохой формой в C ++ и заставляет его выглядеть так textCursor() это не то же самое, что this->textCursor(), Надеюсь, что прочитав предоставленную мною версию Python, вы увидите, что разницы нет.

Ресурсы на будущее
Тег C ++ имеет отличные ссылки на часто задаваемые вопросы по C ++. Я рекомендую прогуляться по C ++ Super-FAQ. Вы узнаете вещи, которые вы не ожидали, что вам нужно знать, и вещи, которые вы не знали, были неясны, будут разъяснены. Существует также Полное руководство и список книг C ++ здесь на ТАК.

Для разработки PyQt Марк Саммерфилд Быстрое программирование GUI с Python и Qt отличная ссылка с рабочим кодом.

2

Другие решения

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 применить изменения.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector