Ir al contenido principal

Ralsina.Me — El sitio web de Roberto Alsina

Como implementar "reemplazar todos" en un QPlainTextEdit

Así es co­mo se im­ple­men­ta 'reem­pla­zar to­do­s' en un QPlain­TextE­dit (o un QTextE­di­t, pro­ba­ble­men­te) usan­do Py­Qt (es si­mi­lar pa­ra C++).

def doReplaceAll(self):
    # Replace all occurences without interaction

    # Here I am just getting the replacement data
    # from my UI so it will be different for you

    # Beginning of undo block

    # Use flags for case match
    if self.searchReplaceWidget.ui.matchCase.isChecked():

    # Replace all we can
    while True:
        # self.editor is the QPlainTextEdit
        if r:
            if qc.hasSelection():

    # Mark end of undo block

Hay otras ma­ne­ras más fá­ci­le­s, pe­ro es­ta ha­ce que to­do apa­rez­ca en una so­la ope­ra­ción en la pi­la un­do­/­re­do y esas co­sas.

Andrés / 2010-02-15 23:42:

Typo en el título ;)

Roberto Alsina / 2010-02-15 23:49:


JoeNotCharles / 2010-02-16 01:01:

Doesn't this break if old is a substring of new? (ie. if you replace "abc" with "abc123", won't it repeatedly expand "abc123", "abc123123", "abc123123123", etc?)

Roberto Alsina / 2010-02-16 01:12:

No because it only does one pass from the cursor position forward.

Scott / 2010-02-16 02:17:

I'm curious to learn as to why you didn't using a QRegExp in place of the while loop?

Roberto Alsina / 2010-02-16 02:25:

This way the code is trivial. With a regexp I need to escape the text I want to replace, and still need to loop since QTextDocument.find only finds the first time it appears (unless I am reading the docs wrong)

Thomas / 2010-02-16 07:23:

Curious; what (programming) language is this?

Roberto Alsina / 2010-02-16 09:41:

That is Python ( using a library called PyQt

mat / 2011-02-23 13:07:

void Editor::SlotReplaceAll(QString findString, QRegExp findExpr, bool isExpr, QString replaceString, bool caseSensitively, bool wholeWords)
QTextDocument *doc = document();
QTextCursor cursor = textCursor();
QTextCursor newCursor = cursor;
quint64 count = 0;

QTextDocument::FindFlags options;
if (caseSensitively) options = options | QTextDocument::FindCaseSensitively;
if (wholeWords) options = options | QTextDocument::FindWholeWords;

if (!findString.isEmpty())
while (true)
if (isExpr)
newCursor = doc->find(findExpr, newCursor, options);
newCursor = doc->find(findString, newCursor, options);

if (!newCursor.isNull())
if (newCursor.hasSelection())
QMessageBox::information(this, tr("ReplaceAll"), tr("%1 occurrence(s) were replaced.").arg(count));

phone number lookup / 2011-12-03 22:20:

this is really interesting viewpoint on the subject i might add

phone number lookup / 2011-12-03 22:30:

this is really interesting viewpoint on the subject i might add

employment background check / 2011-12-27 23:23:

Hi very nice article

employment background check / 2011-12-27 23:28:

Man ... Beautiful . Amazing ... I will bookmark your website and use the your RSS feed also

cell phone lookup / 2012-01-17 05:52:

Your blog has the same post as another author but i like your better

cell phone lookup / 2012-01-17 05:53:

Your blog has the same post as another author but i like your better

Contents © 2000-2020 Roberto Alsina