【问题标题】:QLineEdit: Is there an elegant solution to tell multiple QLineEdit widgets apart in event handler?QLineEdit:是否有一个优雅的解决方案可以在事件处理程序中区分多个 QLineEdit 小部件?
【发布时间】:2011-12-22 06:32:02
【问题描述】:

我在一个配置小部件上有多个 QLineEdit 小部件。

当配置文本更改时,我想存储更新后的值(其中有几个,所以我不想在最后的一个函数调用中传递它们)。

我正在考虑将它们连接到一个插槽或通过QSignalMapper 连接到一个插槽。

但是我很难找到一种优雅的方式来区分 QLineEdits,我想知道哪个 QLineEdit 发出了信号 - 因为我在实现逻辑的处理程序对象中,我无法比较 @ 987654324@与原始对象。

我可以通过QSignalMapper 连接它们,以便我的处理程序获得int idQObject*QWidget* 对发出信号的实际小部件的引用,以便我可以轻松获得新文本,但我会希望能够打开一些 id 以在内部更新正确的设置。

是否有任何优雅的方式来标记或标记 Qt 对象或小部件?

【问题讨论】:

  • 我不明白你为什么不能使用sender() - 你能澄清一下吗?
  • 如果事件在模型中处理,它没有对原始对象的引用,所以我无法比较 sender() 是我的 serverLineEdit 还是其他小部件 - 如果能够获取一些我可以检查的 ID/标签/标签(而不是 objectName() ...)。但也许我做得不对......当按下apply按钮时,我可以将所有值发送给模型......但我正在寻找更优雅的东西

标签: c++ qt qlineedit


【解决方案1】:

您可以使用值“int id”重写您自己的 QLineEdit。并且每当 QLineEdit 发出信号时,也会发出带有参数“id”的您自己的信号。

class MyLineEdit : public QLineEdit
{
   Q_OBJECT
   private: int id;
   public:  int getID() { return id; }
            void setID(int _id) { id = _id; }
   signals: void myTextEdited(QString,int);
   slots:   void emitMyTextEdited(QString text) { emit myTextEdited(text,id); }
   public:  MyLineEdit(QWidget *parent = 0) : QLineEdit(parent)
            {
                connect(this,SIGNAL(textEdited(QString)),this,SLOT(emitMyTextEdited(QString)));
            }
};

这里,如果你想发出带有对象标识的textEdited信号,你可以用你自己的方式重写textEdited信号。

【讨论】:

    【解决方案2】:

    动态属性允许您在运行时将额外数据“标记”到任何 QObject 派生类。请参阅QObject::setProperty 文档。

    我个人不喜欢使用动态属性,因为它们没有记录在类的标题中。我更喜欢从类继承并添加一个标准属性。

    【讨论】:

    • 所有答案都提供了很好的替代解决方案,我想这是Qt 中的一个空白,没有简单的方法可以标记小部件以能够确定在偶数处理程序中正在处理哪个小部件。
    【解决方案3】:

    通过QSignalMapper 连接它们,映射类型为QObject*。您可以将这样的内容定义为您的QObject:

    class MyQLineEditData : public QObject {
      Q_OBJECT
    public:
      QLineEdit* lineEdit ;
      int id ;
    } ;
    

    【讨论】:

      猜你喜欢
      • 2011-07-05
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多