自定义QLineEdit,focusProxy和QDataWidgetMapper

时间:2014-09-18 08:49:00

标签: qt5

这个问题让我疯了,所以我很感激一些帮助。显然做了通常的谷歌搜索和检查qt文档,但没有找到任何解决方案。

我们需要自定义标准QLineEdit。这是一个原型:

class MyLineEdit : public QLineEdit
{
Q_OBJECT

public:
  MyLineEdit(QWidget* a_parent)
  {   
    QTextEdit* textEdit = new QTextEdit(this);
    textEdit->setMinimumWidth(width() / 2);
    textEdit->setMaximumWidth(width() / 2);
    textEdit->setMinimumHeight(30);
    textEdit->setTabChangesFocus(true);

    // background color red
    QPalette p = textEdit->palette();
    p.setColor(QPalette::Base, QColor(244,20,20));
    textEdit->setPalette(p);        

    textEdit->setVisible(true);

    setFocusProxy(textEdit);
  }
};

这会显示QLineEdit,其上面有QTextEdit

使用键盘更改焦点可以按预期工作(TextEdit获得焦点,而不是LineEdit)。

使用鼠标更改焦点按预期工作(选择LineEdit将焦点转移到TextEdit)。

MyLineEdit和常规QLineEdit个实例添加到QDataWidgetMapper。我们显然在setModel实例上使用QDataWidgetMapper方法调用。

QDialog中,使用键盘或鼠标从QLineEdit更改焦点会触发我们QAbstractItemModel::setData的实施调用。

在同一个QDialog中,使用键盘或鼠标从MyLineEdit更改焦点 NOT 会触发我们QAbstractItemModel::setData实施的调用。

此问题似乎与setFocusProxy API有关。删除setFocusProxy行时;

  • 使用键盘或鼠标从MyLineEdit(特别是QLineEdit)更改焦点会触发我们QAbstractItemModel::setData实施的调用。
  • MyLineEdit(特别是QTextEdit)更改焦点 NOT 会触发我们QAbstractItemModel::setData实施的调用。

如何使用setFocusProxy并调用QAbstractItemModel::setData

我做错了什么?

0 个答案:

没有答案