「QTextEdit」コントロールで行(または行の一部)をロックするにはどうすればよいですか?これを行うことができます。行のその部分でカーソル位置を移動すると、カーソルは行のその部分に属していない次の最初の位置に自動的に移動します。多分あなたは別の考えを持っています。ありがとうございました!
質問する
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 に答える