connect(table, &QTableWidget::currentChanged, this, &YourClass::onSelectionChanged);无法访问protected成员 currentChanged
时间: 2024-12-14 10:13:36 浏览: 4
`currentChanged`信号是公开(public)的,但在某些情况下,如果你试图从非友元派生类(即不是内部派生,如private或protected)访问这个信号,你可能会遇到这个问题,因为Qt信号默认不允许访问隐藏的(hidden)、私有的(private)或受保护的(protected)成员。
如果你想要访问`QTableWidget`的`currentChanged`信号,你有以下几个选项:
1. **提升信号到公共域**:如果`currentChanged`是在`QTableWidget`的公开部分定义的,尝试将其提升到公开域,然后在你的类中使用。但这通常意味着你需要修改`QTableWidget`的源码,这不是一个好的做法。
2. **友元声明**:在你的类声明中,通过`friend`关键字声明`QTableWidget`为友元,允许它访问你的类的受保护成员。这应该在头文件中完成:
```cpp
class YourClass : public QObject {
Q_OBJECT
friend class QTableWidget;
private:
// 受保护或私有的成员...
};
```
3. **使用信号安全的方式**:如果你不想改变`QTableWidget`的结构,你可以使用`QMetaObject`来间接地连接信号。但这通常只适用于非常特定的场景,因为它涉及到底层的元信息处理:
```cpp
connect(table, "currentChanged(QModelIndex,QModelIndex)", this, "onSelectionChanged(QModelIndex)");
```
请根据你的代码上下文和设计原则选择合适的解决方案。注意,直接修改原始库的行为是不推荐的,除非你能确定这样做不会影响其他地方。
阅读全文