21 Q_Q(QKeySequenceEdit);
23 lineEdit =
new QLineEdit(q);
24 lineEdit->setObjectName(QStringLiteral(
"qt_keysequenceedit_lineedit"));
25 lineEdit->setClearButtonEnabled(
false);
26 q->connect(lineEdit, &QLineEdit::textChanged, q, [q](
const QString& text) {
34 finishingKeyCombinations = {Qt::Key_Tab, Qt::Key_Backtab};
36 QVBoxLayout *layout =
new QVBoxLayout(q);
37 layout->setContentsMargins(0, 0, 0, 0);
38 layout->addWidget(lineEdit);
40 std::fill_n(key, QKeySequencePrivate::MaxKeyCount, QKeyCombination::fromCombined(0));
42 lineEdit->setFocusProxy(q);
43 lineEdit->installEventFilter(q);
46 q->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
47 q->setFocusPolicy(Qt::StrongFocus);
48 q->setAttribute(Qt::WA_MacShowFocusRect,
true);
49 q->setAttribute(Qt::WA_InputMethodEnabled,
false);
189void QKeySequenceEdit::setMaximumSequenceLength(qsizetype count)
191 Q_D(QKeySequenceEdit);
193 if (count < 1 || count > QKeySequencePrivate::MaxKeyCount) {
194 qWarning(
"QKeySequenceEdit: maximumSequenceLength %lld is out of range (1..%d)",
195 qlonglong(count), QKeySequencePrivate::MaxKeyCount);
198 d->maximumSequenceLength =
int(count);
199 if (d->keyNum > count) {
200 for (qsizetype i = d->keyNum; i < count; ++i)
201 d->key[i] = QKeyCombination::fromCombined(0);
203 d->rebuildKeySequence();
232void QKeySequenceEdit::setKeySequence(
const QKeySequence &keySequence)
234 Q_D(QKeySequenceEdit);
238 if (d->keySequence == keySequence)
241 const auto desiredCount = keySequence.count();
242 if (desiredCount > d->maximumSequenceLength) {
243 qWarning(
"QKeySequenceEdit: setting a key sequence of length %d "
244 "when maximumSequenceLength is %d, truncating.",
245 desiredCount, d->maximumSequenceLength);
248 d->keyNum = std::min(desiredCount, d->maximumSequenceLength);
249 for (
int i = 0; i < d->keyNum; ++i)
250 d->key[i] = keySequence[i];
251 for (
int i = d->keyNum; i < QKeySequencePrivate::MaxKeyCount; ++i)
252 d->key[i] = QKeyCombination::fromCombined(0);
254 d->rebuildKeySequence();
256 d->lineEdit->setText(d->keySequence.toString(QKeySequence::NativeText));
258 emit keySequenceChanged(d->keySequence);
309void QKeySequenceEdit::keyPressEvent(QKeyEvent *e)
311 Q_D(QKeySequenceEdit);
313 if (d->finishingKeyCombinations.contains(e->keyCombination())) {
318 int nextKey = e->key();
320 if (d->prevKey == -1) {
322 d->prevKey = nextKey;
325 d->lineEdit->setPlaceholderText(QString());
326 if (nextKey == Qt::Key_Control
327 || nextKey == Qt::Key_Shift
328 || nextKey == Qt::Key_Meta
329 || nextKey == Qt::Key_Alt
330 || nextKey == Qt::Key_unknown) {
334 QString selectedText = d->lineEdit->selectedText();
335 if (!selectedText.isEmpty() && selectedText == d->lineEdit->text()) {
337 if (nextKey == Qt::Key_Backspace)
341 if (d->keyNum >= d->maximumSequenceLength)
344 if (e->modifiers() & Qt::ShiftModifier) {
345 const QList<QKeyCombination> possibleKeys = QKeyMapper::possibleKeys(e);
346 int pkTotal = possibleKeys.size();
350 for (
int i = 0; i < possibleKeys.size(); ++i) {
351 const int key = possibleKeys.at(i).toCombined();
352 if (key - nextKey ==
int(e->modifiers())
353 || (key == nextKey && e->modifiers() == Qt::ShiftModifier)) {
361 nextKey = possibleKeys.first().toCombined();
363 nextKey |= d->translateModifiers(e->modifiers(), e->text());
367 d->key[d->keyNum] = QKeyCombination::fromCombined(nextKey);
370 d->rebuildKeySequence();
371 QString text = d->keySequence.toString(QKeySequence::NativeText);
372 if (d->keyNum < d->maximumSequenceLength) {
374 text = tr(
"%1, ...").arg(text);
376 d->lineEdit->setText(text);
383void QKeySequenceEdit::keyReleaseEvent(QKeyEvent *e)
385 Q_D(QKeySequenceEdit);
387 if (d->prevKey == e->key()) {
388 if (d->keyNum < d->maximumSequenceLength)
389 d->releaseTimer.start(1s,
this);