Qt中如何实现快捷输入框
How to implement shortcut input box in Qt
在qtcreator这样的软件中你可以看到这样的东西:
基本上是一些框,点击后会要求您按一些键盘组合以记录快捷方式。
如何在 Qt 中创建类似的东西?到目前为止,我只能使用常规文本框来实现这一点,用户必须自己在其中键入组合,如果出现不正确的消息框,但如果用户不必键入内容会简单得多喜欢 "ctrl + f2" 但点击这些键。
是否有任何 Qt 小部件?
使用 QKeySequenceEdit,自 Qt 5.2 起可用。它允许您像在 Qt Designer 中一样记录快捷键。
如果您需要 Qt 的小部件 4.x,我之前已经实现了一个。三个关键部分是:
- 读取用户输入
- 将其转换为人类可读的字符串
- 使用字符串创建 QKeySequence
小部件记录了多个快捷方式,就像在 Designer 中一样。可以通过 Delete 或 Backspace 清除快捷方式。
#define MAX_SHORTCUTS 3
QString ShortcutLineEdit::keyEventToString(QKeyEvent *e)
{
int keyInt = e->key();
QString seqStr = QKeySequence(e->key()).toString();
if (seqStr.isEmpty() ||
keyInt == Qt::Key_Control ||
keyInt == Qt::Key_Alt || keyInt == Qt::Key_AltGr ||
keyInt == Qt::Key_Meta ||
keyInt == Qt::Key_Shift)
{
return "";
}
QStringList sequenceStr;
if (e->modifiers() & Qt::ControlModifier)
sequenceStr << "Ctrl";
if (e->modifiers() & Qt::AltModifier)
sequenceStr << "Alt";
if (e->modifiers() & Qt::ShiftModifier)
sequenceStr << "Shift";
if (e->modifiers() & Qt::MetaModifier)
sequenceStr << "Meta";
return sequenceStr.join("+") + (sequenceStr.isEmpty() ? "" : "+") + seqStr;
}
void ShortcutLineEdit::keyPressEvent(QKeyEvent *e)
{
QString text =text();
int keyInt = e->key();
bool modifiers = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier | Qt::AltModifier | Qt::MetaModifier);
if (!modifiers && (keyInt == Qt::Key_Delete || keyInt == Qt::Key_Backspace)) {
setText("");
return;
}
QString sequenceStr = keyEventToString(e);
if (sequenceStr == "") {
QLineEdit::keyPressEvent(e);
return;
}
if (text.split(", ").size() >= MAX_SHORTCUTS)
text = "";
if (!text.isEmpty())
text += ", ";
setText(text + sequenceStr);
}
void ShortcutLineEdit::apply()
{
QList<QKeySequence> sequenceList;
QStringList sequenceStrList = text().split(", ");
foreach (QString str, sequenceStrList)
sequenceList << QKeySequence(str);
// use sequenceList somehow
}
在qtcreator这样的软件中你可以看到这样的东西:
基本上是一些框,点击后会要求您按一些键盘组合以记录快捷方式。
如何在 Qt 中创建类似的东西?到目前为止,我只能使用常规文本框来实现这一点,用户必须自己在其中键入组合,如果出现不正确的消息框,但如果用户不必键入内容会简单得多喜欢 "ctrl + f2" 但点击这些键。
是否有任何 Qt 小部件?
使用 QKeySequenceEdit,自 Qt 5.2 起可用。它允许您像在 Qt Designer 中一样记录快捷键。
如果您需要 Qt 的小部件 4.x,我之前已经实现了一个。三个关键部分是:
- 读取用户输入
- 将其转换为人类可读的字符串
- 使用字符串创建 QKeySequence
小部件记录了多个快捷方式,就像在 Designer 中一样。可以通过 Delete 或 Backspace 清除快捷方式。
#define MAX_SHORTCUTS 3
QString ShortcutLineEdit::keyEventToString(QKeyEvent *e)
{
int keyInt = e->key();
QString seqStr = QKeySequence(e->key()).toString();
if (seqStr.isEmpty() ||
keyInt == Qt::Key_Control ||
keyInt == Qt::Key_Alt || keyInt == Qt::Key_AltGr ||
keyInt == Qt::Key_Meta ||
keyInt == Qt::Key_Shift)
{
return "";
}
QStringList sequenceStr;
if (e->modifiers() & Qt::ControlModifier)
sequenceStr << "Ctrl";
if (e->modifiers() & Qt::AltModifier)
sequenceStr << "Alt";
if (e->modifiers() & Qt::ShiftModifier)
sequenceStr << "Shift";
if (e->modifiers() & Qt::MetaModifier)
sequenceStr << "Meta";
return sequenceStr.join("+") + (sequenceStr.isEmpty() ? "" : "+") + seqStr;
}
void ShortcutLineEdit::keyPressEvent(QKeyEvent *e)
{
QString text =text();
int keyInt = e->key();
bool modifiers = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier | Qt::AltModifier | Qt::MetaModifier);
if (!modifiers && (keyInt == Qt::Key_Delete || keyInt == Qt::Key_Backspace)) {
setText("");
return;
}
QString sequenceStr = keyEventToString(e);
if (sequenceStr == "") {
QLineEdit::keyPressEvent(e);
return;
}
if (text.split(", ").size() >= MAX_SHORTCUTS)
text = "";
if (!text.isEmpty())
text += ", ";
setText(text + sequenceStr);
}
void ShortcutLineEdit::apply()
{
QList<QKeySequence> sequenceList;
QStringList sequenceStrList = text().split(", ");
foreach (QString str, sequenceStrList)
sequenceList << QKeySequence(str);
// use sequenceList somehow
}