Я не хочу, чтобы средняя кнопка мыши вставляла текст в мой QTextEdit. Этот код не работает. TextEdit
наследуется QTextEdit
, После вставки средней кнопки мыши вставляется скопированный текст.
void TextEdit::mousePressEvent ( QMouseEvent * e ) {
if (e->button() == Qt::MidButton) {
e->accept();
return;
};
QTextEdit::mousePressEvent(e);
}
Поскольку щелчки мыши обычно регистрируются при отпускании кнопки, вам следует переопределить mouseReleaseEvent
функция.
Вам даже не нужно переопределять mousePressEvent
потому что средняя кнопка вообще не обрабатывается этой функцией.
Я предполагаю, что вы используете Linux здесь; щелчок правой кнопкой мыши в окне, вероятно, вызовет вставку данных MIME до того, как вы обработаете событие мыши, поэтому оно все еще вставляет текст.
Следовательно, в соответствии с документацией Qt для вставки: — «чтобы изменить то, что QTextEdit может вставлять и как он вставляется, переопределите виртуальные функции canInsertFromMimeData () и insertFromMimeData ()».
Я был в том же случае, то есть иметь части моего 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()));
}
}
}
}