如何在“QTextEdit”控件中锁定一行(或一行的一部分)?我可以这样做:当我在该行的那部分移动光标位置时,光标将自动移动到不属于该行该部分的下一个第一个位置。也许你有antoher的想法。谢谢!
问问题
547 次
2 回答
0
我会连接到QTextEdit::cursorPositionChanged()
并处理那里的运动。
http://qt-project.org/doc/qt-4.8/qtextcursor.html#position
http://qt-project.org/doc/qt-4.8/qtextedit.html#textCursor
QObject::connect(myTextEdit, SIGNAL(cursorPositionChanged()),
this, SLOT(on_cursorPositionChanged()));
// ...
int lockedAreaStart = 15;
int lockedAreaEnd = 35;
// ...
void MyWidget::on_cursorPositionChanged()
{
int lockedAreaMiddle = (lockedAreaEnd + lockedAreaStart)/2.;
int cursorPosition = myTextEdit->textCursor().position();
if(cursorPosition > lockedAreaStart && cursorPosition < lockedAreaEnd)
{
if(cursorPosition < lockedAreaMiddle)
{
// was to the left of the locked area, move it to the right
myTextEdit->textCursor().setPosition(lockedAreaEnd);
}
else
{
// was to the right of the locked area, move it to the left
myTextEdit->textCursor().setPosition(lockedAreaStart);
}
}
}
您可以通过继承 QTextEdit 并重新实现setPosition()
.
您可能还需要在上面的代码中添加一些错误处理。当在“锁定行”之前插入文本时,您可能需要修改lockedAreaStart 和lockedAreaEnd。
希望有帮助。
于 2013-01-28T19:46:29.543 回答
0
我认为实现这一目标的最佳方法是继承 QTextEdit 并重新实现 event() 方法来处理所有可能更改锁定行的事件。像这样的东西:
class MyTextEdit : public QTextEdit
{
Q_OBJECT
public:
bool event(QEvent *event)
{
switch (event->type()) {
case QEvent::KeyPress:
case QEvent::EventThatMayChangeALine2:
case QEvent::EventThatMayChangeALine3:
if (tryingToModifyLockedLine(event)) {
return true; // true means "event was processed"
}
}
return QTextEdit::event(event); // Otherwise delegate to QTextEdit
}
};
此外QEvent::KeyPress
,可能还有一些其他事件可以更改您的文本。例如QEvent::Drop
有关活动的更多信息,请参阅:
于 2013-01-28T20:02:04.910 回答