Как отключить функциональность средней кнопки QTextEdit?

Я не хочу, чтобы средняя кнопка мыши вставляла текст в мой QTextEdit. Этот код не работает. TextEdit наследуется QTextEdit, После вставки средней кнопки мыши вставляется скопированный текст.

void TextEdit::mousePressEvent ( QMouseEvent * e ) {
if (e->button() == Qt::MidButton) {
e->accept();
return;
};
QTextEdit::mousePressEvent(e);
}

2

Решение

Поскольку щелчки мыши обычно регистрируются при отпускании кнопки, вам следует переопределить mouseReleaseEvent функция.

Вам даже не нужно переопределять mousePressEventпотому что средняя кнопка вообще не обрабатывается этой функцией.

2

Другие решения

Я предполагаю, что вы используете Linux здесь; щелчок правой кнопкой мыши в окне, вероятно, вызовет вставку данных MIME до того, как вы обработаете событие мыши, поэтому оно все еще вставляет текст.

Следовательно, в соответствии с документацией Qt для вставки: — «чтобы изменить то, что QTextEdit может вставлять и как он вставляется, переопределите виртуальные функции canInsertFromMimeData () и insertFromMimeData ()».

1

Я был в том же случае, то есть иметь части моего CustomQTextEdit должен быть нередактируемый.

Поскольку я действительно люблю функцию вставки средней кнопки мыши, я не хотел ее отключать. Итак, вот (более или менее быстрый и грязный код) обходной путь, который я использовал:

void QTextEditHighlighter::mouseReleaseEvent(QMouseEvent *e)
{

QString prev_text;
if (e->button() == Qt::MidButton) {
// Backup the text as it is before middle button click
prev_text = this->toPlainText();
// And let the paste operation occure...
//        e->accept();
//        return;
}

// !!!!
QTextEdit::mouseReleaseEvent(e);
// !!!!

if (e->button() == Qt::MidButton) {

/*
* Keep track of the editbale ranges (up to you).
* My way is a single one range inbetween the unique
* tags "//# BEGIN_EDIT" and "//# END_EDIT"...
*/
QRegExp begin_regexp = QRegExp("(^|\n)(\\s)*//# BEGIN_EDIT[^\n]*(?=\n|$)");
QRegExp end_regexp  = QRegExp("(^|\n)(\\s)*//# END_EDIT[^\n]*(?=\n|$)");

QTextCursor from = QTextCursor(this->document());
from.movePosition(QTextCursor::Start);

QTextCursor cursor_begin = this->document()->find(begin_regexp, from);
QTextCursor cursor_end = this->document()->find(end_regexp, from);
cursor_begin.movePosition(QTextCursor::EndOfBlock);
cursor_end.movePosition(QTextCursor::StartOfBlock);
int begin_pos = cursor_begin.position();
int end_pos = cursor_end.position();

if (!(cursor_begin.isNull() || cursor_end.isNull())) {
// Deduce the insertion index by finding the position
// of the first character that changed between previous
// text and the current "after-paste" text
int insert_pos; //, end_insert_pos;
std::string s_cur = this->toPlainText().toStdString();
std::string s_prev = prev_text.toStdString();

int i_max = std::min(s_cur.length(), s_prev.length());
for (insert_pos=0; insert_pos < i_max; insert_pos++) {
if (s_cur[insert_pos] != s_prev[insert_pos])
break;
}
// If the insertion point is not in my editable area: just restore the
// text as it was before the paste occured
if (insert_pos < begin_pos+1 || insert_pos > end_pos) {
// Restore text (ghostly)
((MainWindow *)this->topLevelWidget())->disconnect(this, SIGNAL(textChanged()), ((MainWindow *)this->topLevelWidget()), SLOT(on_textEdit_CustomMacro_textChanged()));
this->setText(prev_text);
((MainWindow *)this->topLevelWidget())->connect(this, SIGNAL(textChanged()), ((MainWindow *)this->topLevelWidget()), SLOT(on_textEdit_CustomMacro_textChanged()));
}
}
}

}
0
По вопросам рекламы [email protected]