5

我想QLineEdit通过发送 KeyEvent 来附加字符。我正在使用这样的代码:

ui.myEdit->setFocus();
for(size_t i = 0; i < 10; ++i) {
   QKeyEvent keyPressed(QKeyEvent::KeyPress, 'a', Qt::NoModifier);
   QWidget::keyPressEvent(&keyPressed); // or
   //QApplication::sendEvent(QApplication::focusWidget(), &keyPressed);
}

为什么没有变化myEdit

4

3 回答 3

6

您可以通过以下方式更改更改文本QLineEdit

ui->myEdit->setText(ui->myEdit->text().append("a"));

但是如果你真的想通过发送来改变它,QKeyEvent你可以试试这个:

QKeyEvent * eve1 = new QKeyEvent (QEvent::KeyPress,Qt::Key_A,Qt::NoModifier,"a");
QKeyEvent * eve2 = new QKeyEvent (QEvent::KeyRelease,Qt::Key_A,Qt::NoModifier,"a");

qApp->postEvent((QObject*)ui->myEdit,(QEvent *)eve1);
qApp->postEvent((QObject*)ui->myEdit,(QEvent *)eve2);
于 2014-06-20T11:13:00.870 回答
1

合成按键事件以将字符附加到行编辑是在寻找无穷无尽的麻烦。您需要保留控件的状态以确保您实际上是在附加字符。如果光标不在末尾,您将插入或前置字符。如果有任何修改器处于活动状态,您可以使小部件表现得就像激活了剪贴板快捷方式一样。假设您在按住 Ctrl/⌘ 的同时“附加”一个 X,您将导致任何选定的文本从行编辑中消失。

换句话说:如果您想将某些内容附加到文本编辑中,只需附加它,不要合成击键。

lineEdit->setText(lineEdit->text() + "appended");

而已。要通过附加击键正确地做到这一点,需要大约一页代码,即使这样也不能不依赖 Qt 的实现细节。

于 2014-06-20T14:20:06.763 回答
1

你的方法不明智。

  1. 自己设置焦点可能会惹恼不止一个用户,他们将焦点从一个 UI 元素转移到另一个。
  2. 通过直接调用keyPressEvent,您将跳过框架中的许多处理层。只有不当行为在这条路上等待。

回复

我想将字符附加到 QLineEdit

您可以获取行编辑文本,随意修改并重新设置。

QString currentText = ui.myEdit->text();
QString toappend    = "aaaaaaaaaa";
QString nextText    = currentText + toappend;
ui.myEdit->setText(nextText);

或一行

ui.myEdit->setText(ui.myEdit->text()+mystring);
于 2014-06-20T10:28:50.227 回答