<html theme="themeKey1rand100" iconset="color"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head><body text="#000000">Hi Maurizio. Thanks again (you were one of
the ones who frequently helped me two years ago).<br>
<br>
I hit on a solution that is essentially that. My own statement:<br>
<br>
<span style="color: rgb(0, 106, 169);"><span style="font-style: italic;">Is
it possible to save
the widget state information just after every keyboard and mouse event,
but before the </span></span><span style="color: rgb(0, 106, 169);"><span
style="font-style: italic;"><span style="font-family: monospace;">textChanged</span></span></span><span
style="color: rgb(0, 106, 169);"><span style="font-style: italic;">
slot gets called?</span></span><br>
<br>
at the end of my post got me thinking that way. As far as I can see,
the only way the cursor can move (if not programmatically, by the code
itself) is either by user keyboard input or mouse input. So putting
code in to snag the cursor position on each keystroke and mouse button
release seems to do it. This picks up the cursor position before it
moves.<br>
<br>
It seemed like a bit of a sledgehammer solution. But it seems to work.<br>
<br>
Thanks!<br>
<br>
/John<br>
<span>
</span><br>
<blockquote type="cite"
cite="mid:3791d3fb-1b3f-2154-516f-0effa197108c@sturtz.org"
style="border: 0px none ! important;">
<div xmlns="http://www.w3.org/1999/xhtml" class="__pbConvHr"
style="margin:30px 25px 10px 25px;"><div
style="width:100%;border-top:2px solid
rgba(146,154,163,0.7);padding-top:10px;"> <div
style="display:inline-block;white-space:nowrap;vertical-align:middle;width:49%;">
<a style="color:#485664
!important;padding-right:6px;font-weight:500;text-decoration:none
!important;" href="mailto:john@sturtz.org" moz-do-not-send="true">John F
Sturtz</a></div> <div
style="display:inline-block;white-space:nowrap;vertical-align:middle;width:48%;text-align:
right;"> <font color="#909AA4"><span style="padding-left:6px">Sunday,
March 21, 2021 10:41 PM</span></font></div> </div></div>
<div xmlns="http://www.w3.org/1999/xhtml" class="__pbConvBody"
__pbrmquotes="true"
style="color:#909AA4;margin-left:24px;margin-right:24px;">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
Hello PyQt forum. I posted several questions here a couple years ago,
and several people were wonderfully helpful. I've been away awhile, but
am fiddling with another PyQt project, and I seem to be stumped by
this. I feel like I must be stupidly overlooking something.<br>
<br>
I have a <span style="font-family: monospace;">QPlainTextEdit</span>
widget. I've connected the <span style="font-family: monospace;">textChanged</span>
signal to a slot. Now I simply want this: For the slot to be able to
know what the widget looked like -- both text contents <span
style="font-style: italic;">and</span> cursor position -- before the
change occurred.<br>
<br>
First pass idea is to save the state of the widget text and cursor
position at the end of the <span style="font-family: monospace;">textChanged</span>
slot, so the next time around, I
have a record of what they previously were. That works as long as the
cursor changes position only because of changing text.<br>
<br>
But of course, you
can move the cursor without changing text as well. So then I can also
connect the <span style="font-family: monospace;">cursorPositionChanged</span>
signal to a slot,
keep track of when the cursor moves, and maintain the previous cursor
location that way as well.<br>
<br>
The problem is that when text changes, the cursor may also move. (Not
necessarily, but probably). In which case both slots get called, and <span
style="font-family: monospace;"><span style="font-family: sans-serif;">by
the time the second (</span></span><span style="font-family:
monospace;">textChanged</span><span style="font-family: monospace;"><span
style="font-family: sans-serif;">) executes, the information has
already been overwritten.</span></span><span style="font-family:
monospace;"></span><span style="font-family: monospace;"></span><br>
<br>
Sample code is attached. For example, try this:<br>
<ul>
<li>Start up the app. Widget gets created, pre-populated with text
<span style="font-family: monospace;">'abc'</span>.</li>
<li>Move the cursor two positions to the right (between the <span
style="font-family: monospace;">'b'</span> and
<span style="font-family: monospace;">'c'</span>). The <span
style="font-family: monospace;">cursorPositionChanged</span> slot gets
called for both moves, so
that at the end, it is aware that the previous cursor position was 1,
and the current position is 2.</li>
<li>Now insert a character (either type it or paste it; the result
is the same either way).</li>
</ul>
<p>The <span style="font-family: monospace;">cursorPositionChanged</span>
slot gets called again, and is briefly aware that the previous cursor
location was 2 and it is now 3. But then it updates the previous
position to 3 before exiting (as it must, to be useful). When the <span
style="font-family: monospace;">text</span><span style="font-family:
monospace;">Changed</span> slot gets called, it no longer has any way to
know that the cursor position was 2 prior to the change.<br>
</p>
I guess what I need is for the <span style="font-family: monospace;">cursorPositionChanged</span>
slot to somehow know the difference between when the cursor moved
because of changing text and when it just moved.<br>
<br>
After much head-scratching, I haven't come up with anything. But surely
there must be a way around this? (I wish there were a '<span
style="font-family: monospace;">textIsAb</span><span style="font-family:
monospace;">outToChange</span>' signal ...). Is it possible to save
the widget state information just after every keyboard and mouse event,
but before the <span style="font-family: monospace;">textChanged</span>
slot gets called?<br>
<br>
Any thoughts appreciated.<br>
<br>
Thanks!<br>
<br>
/John<br>
</div>
</blockquote>
<br>
</body></html>