0

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

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

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

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

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

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

4

3 回答 3

2

您可以使用值“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 信号。

于 2011-12-22T11:44:36.503 回答
1

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

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

于 2011-12-22T11:30:18.563 回答
1

将它们连接起来QSignalMapper,映射类型为QObject*. 您可以将这样的内容定义为您的QObject

class MyQLineEditData : public QObject {
  Q_OBJECT
public:
  QLineEdit* lineEdit ;
  int id ;
} ;
于 2011-12-22T12:07:41.790 回答