是否有更简洁的方法将不同类型的许多Qt小部件连接到同一个插槽?

时间:2013-09-23 16:06:09

标签: qt user-interface signals signals-slots

我正在尝试制作一个选项对话框,以便在应用设置时节省尽可能多的时间。

使用的小部件分布在4个选项卡中,可以选择组框,复选框,单选按钮,文本输入字段,旋转计数器和组合框,但这些是最常见的。

我在每个标签中都有一个布尔标志,如果其上的任何单个小部件以某种方式发生变化,我希望将其更改为true。这意味着当调用apply方法时,对话框可以检查每个选项卡的标志以查看选项卡是否已被更改,如果它没有改变则忽略它。

以下是我当前解决方案的示例,setModified()是设置标志的函数:

connect(chkShowFormula, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(chkShowAxis, SIGNAL(stateChanged(int)), this, SLOT(setModified()));
connect(cmbAxisType, SIGNAL(currentIndexChanged(int)), this, SLOT(setModified()));
connect(cmbAxisType, SIGNAL(editTextChanged(QString)), this, SLOT(setModified()));
connect(cmbFormat, SIGNAL(currentIndexChanged(int)), this,  SLOT(setModified()));
connect(grpShowLabels, SIGNAL(clicked(bool)), this,  SLOT(setModified()));
connect(btnAxesFont, SIGNAL(clicked()), this, SLOT(setModified()));
connect(btnLabelFont, SIGNAL(clicked()), this, SLOT(setModified()));

是否有更简洁的方法将所有这些信号绑定到同一个插槽?因为这只是我正在处理的信号量的一小部分。

我的另一个担心是这种方法几乎会不断发射,所以我也在寻找另一种解决方案。

1 个答案:

答案 0 :(得分:4)

对于可编辑控件,编辑的值(复选框状态,列表项索引等)称为用户属性。可以以编程方式提取此属性的通知信号,从而将其连接到插槽:

QMetaMethod slot = this->metaObject()->method(this->metaObject()->indexOfSlot("setModified()"));
QList<QWidget*> widgets;
foreach (QWidget * widget, widgets) {
  QMetaProperty prop = widget->metaObject()->userProperty();
  if (!prop.isValid() || !prop.hasNotifySignal())
    continue;
  connect(widget, prop.notifySignal(), this, slot);
}