如何在" QTextEdit"中锁定一条线(或线的一部分)?控制?我可以这样做:当我在该行的那一部分移动光标位置时,光标将自动移动到下一个不属于该行部分的第一个位置。也许你有其他想法。 谢谢!
答案 0 :(得分: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。
希望有所帮助。
答案 1 :(得分: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
有关活动的更多信息,请参阅: