Qt发送keyPressEvent

时间:2014-06-20 07:59:10

标签: c++ qt keypress key-events qkeyevent

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

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没有变化?

3 个答案:

答案 0 :(得分:4)

您可以通过以下方式更改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);

答案 1 :(得分:0)

你的做法并不明智。

  1. 自己设置焦点可能会使一个以上的用户烦恼,这个用户从另一个UI元素中失去焦点。
  2. 通过直接调用keyPressEvent,您正在从框架中跳过多层处理。只有不端行为等待着这条道路。
  3. 回复

      

    我想将字符追加到QLineEdit

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

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

    或一行

    ui.myEdit->setText(ui.myEdit->text()+mystring);
    

答案 2 :(得分:0)

合成按键事件以将字符附加到行编辑是一个无穷无尽的麻烦。您需要保留控件的状态,以确保您实际上追加字符。如果光标不在末尾,则您将插入或添加字符。如果任何修饰符处于活动状态,则可能会使窗口小部件的行为就像激活剪贴板快捷方式一样。如果你&#34;追加&#34;在按住Ctrl /⌘的同时按下X键,您将导致任何选定的文本从行编辑中消失。

换句话说:如果你想在textedit上附加内容,只需附加它,就不要合成击键。

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

那就是它。要通过附加击键来正确,需要大约一页代码,即使这样,它也不能依赖Qt的实现细节。