QLineEdit: существует ли элегантное решение, позволяющее различать несколько виджетов QLineEdit в обработчике событий? - PullRequest
0 голосов
/ 22 декабря 2011

У меня несколько виджетов QLineEdit в виджете конфигурации.

Когда текст конфигурации изменяется, я хочу сохранить обновленное значение (их несколько, поэтому я не хочу их передаватьв конце одного вызова функции).

Я думал соединить их с одним слотом или пройти через QSignalMapper с одним слотом.

Однако у меня возникли проблемы с поиском элегантного способачтобы отделить QLineEdit s, я хочу знать, какой QLineEdit испустил сигнал - поскольку я нахожусь в объекте-обработчике, который реализует логику, я не могу сравнить sender() с исходным объектом.

Я могу подключить их через QSignalMapper, чтобы мой обработчик получил либо int id, либо QObject*, либо QWidget* ссылку на фактический виджет, который генерировал сигнал, чтобы я мог легко получить новый текст, но я хотел бы бытьвозможность включить какой-либо идентификатор для внутреннего обновления правильных настроек.

Есть ли какой-нибудь элегантный способ пометить или пометить объекты или виджеты Qt?

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

Вы можете переписать свой собственный QLineEdit со значением "int id". И всякий раз, когда 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 вашим способом.

1 голос
/ 22 декабря 2011

Подключите их через QSignalMapper с типом отображения QObject*. Вы можете определить что-то вроде этого как ваш QObject:

class MyQLineEditData : public QObject {
  Q_OBJECT
public:
  QLineEdit* lineEdit ;
  int id ;
} ;
1 голос
/ 22 декабря 2011

Динамические свойства позволяют вам «тегировать» дополнительные данные во время выполнения на любой производный класс QObject. См. Документацию QObject::setProperty.

Мне лично не нравится использовать динамические свойства, так как они не документированы в заголовке класса. Я предпочитаю наследовать от класса и добавить стандартное свойство.

...