在QTextEdit中锁定一行

时间:2013-01-28 17:08:39

标签: qt text locking editor line

如何在" QTextEdit"中锁定一条线(或线的一部分)?控制?我可以这样做:当我在该行的那一部分移动光标位置时,光标将自动移动到下一个不属于该行部分的第一个位置。也许你有其他想法。 谢谢!

2 个答案:

答案 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

有关活动的更多信息,请参阅:

http://doc.qt.digia.com/qt/eventsandfilters.html