我在配置小部件上有多个QLineEdit
小部件。
当配置文本被更改时,我想存储更新的值(其中有一些,所以我不想在最后的一个函数调用中传递它们。)
我正在考虑将它们连接到一个插槽或通过QSignalMapper
到一个插槽。
然而,我无法找到一种优雅的方式来告诉QLineEdit
s,我想知道哪个QLineEdit发出了信号 - 因为我在处理器对象中实现了我无法比较的逻辑sender()
与原始对象。
我可以通过QSignalMapper
将它们连接起来,以便我的处理程序获得int id
或QObject*
或QWidget*
引用发出信号的实际窗口小部件,以便我可以获得很容易新文本,但我希望能够打开一些内部更新正确的设置。
有没有优雅的方法来标记或标记Qt对象或小部件?
答案 0 :(得分: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信号。
答案 1 :(得分:1)
动态属性允许您在运行时将额外数据“标记”到任何QObject派生类。请参阅QObject::setProperty
文档。
我个人不喜欢使用动态属性,因为它们未在类的标题中记录。我更喜欢从类继承并添加标准属性。
答案 2 :(得分:1)
通过QSignalMapper
连接它们,映射类型为QObject*
。您可以将此类内容定义为QObject
:
class MyQLineEditData : public QObject {
Q_OBJECT
public:
QLineEdit* lineEdit ;
int id ;
} ;