0

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

4

2 回答 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

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

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

于 2013-01-28T20:02:04.910 回答