消除QGraphics生成的"unused parameter 'widget'"警告的干净方法项目::p aint
Clean way to eliminate "unused parameter 'widget'" warning generated by QGraphicsItem::paint
QGraphicsItem::paint
具有以下签名:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
当我创建自定义QGraphicsItem
时,我必须提供该函数的实现。问题是……我从不需要使用option
和widget
参数,但由于显而易见的原因,我不能只是删除它们。我总是看到这些编译器警告:
警告:未使用的参数' widget '
警告:未使用的参数' option '
是否有适当的方法来摆脱这些警告?我知道我可以通过在函数中提到未使用的参数来隐藏它们,但这是一个非常肮脏的解决方案,我想知道是否有更好的选择。
省略参数名:
void paint( ..., QWidget* ) {
或者使用Q_UNUSED宏:
void paint( ..., QWidget* widget ) {
Q_UNUSED( widget )
...
不要为未使用的参数提供参数名。例如(我不确定你的"事件"指的是什么),为了摆脱warning: unused parameter ‘option’
,将你的签名更改为:
void paint(QPainter *painter, const QStyleOptionGraphicsItem * /* unused */, QWidget *widget)
(就警告而言,/* unused */
标记是不必要的,但我发现它对人类读者很有用。)
基本上有三种适当的方法来静音未使用参数的编译器警告:
显式地将未使用的形参强制转换为void:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
(void)option;
(void)widget;
// ...
}
此模式符合标准,并且被程序员广泛理解。像GCC这样的编译器看到使用了参数,因此不会发出警告,并且它们优化了这些行,因为它们是无操作的(即没有效果)。
或者,你可以使用Qt的Q_UNUSED
宏:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
Q_UNUSED(option);
Q_UNUSED(widget);
// ...
}
对于GCC和其他类型,它也扩展到(void)
-cast模式,但它也可能包括对模糊编译器的解决方案,这还不够。例如,在Qt 5.4.1中它被定义为:
#if defined(Q_CC_RVCT)
template <typename T>
inline void qUnused(T &x) { (void)x; }
# define Q_UNUSED(x) qUnused(x);
#else
# define Q_UNUSED(x) (void)x;
#endif
使用Q_UNUSED
更容易阅读,并且必须用于对Qt的贡献。
注释掉参数名的第三个选项:
void paint(QPainter *painter, const QStyleOptionGraphicsItem * /* option */,
QWidget * /* widget */)
{
// ...
}
这可能更难以阅读。此外,它可能会增加完全删除参数名称的诱惑——这可能会使函数更难理解。当修改代码以使用之前未使用的参数时,这种样式当然也比其他样式涉及更多的编辑操作。
使用Qt宏:Q_UNUSED
来完成
可以省略参数名,告诉编译器它没有被使用:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
您还可以在.pro文件中设置编译标志。这些是gcc的标志:
QMAKE_CXXFLAGS += -Wno-unused-parameter
QMAKE_CFLAGS += -Wno-unused-parameter
这样你就不需要修改你的代码来抑制这个警告。
这可能不适合每个人,但这是另一个选择。
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 在Visual Studio C++项目中包含源库的正确方法是什么?
- 实现Eigen's块或Boost's的项目方法
- Visual Studio 2015资源视图和资源编译器使用不同的方法在项目目录中查找图标文件.如何修复
- 有没有一种简单的方法可以在C++中获取特定索引之后向量中的所有项目?
- 是否可以简化此方法以安装和导出基于 CMake 的项目?
- 有没有更好的方法来检测向量中一个项目的多次出现?
- 是否有其他方法将.dll文件从一个项目复制到我的启动项目中的可执行文件旁边
- 我有一个启用了代理存根支持的 ATL 项目,在哪里可以找到 xdlldata.h 文件中所有方法的实现
- C++简单的暴力项目密码输入方法
- Winforms-将Visual C 项目UI转换为Visual C#的任何方法
- (C )正在创建专门用于处理所有其他自定义对象的类/对象一种处理项目的正确方法
- 从多个 std::vector 中删除项目的最快方法
- 使用VCPKG与朋友共享您的项目的最佳方法是什么?
- 使用C 支持创建Android项目的正确方法
- 在C 开源项目中包括单位测试的最佳方法
- 测试项目在访问私有静态方法时遇到问题,尽管我从未直接调用过它
- 这是从VS window c ++项目迁移到linux项目的最有效方法
- Qt项目中对glew方法的未定义引用
- 消除QGraphics生成的"unused parameter 'widget'"警告的干净方法项目::p aint