我想从struct的对象中获取结果。
allitems.h
#ifndef ALLITEMS_H
#define ALLITEMS_H
#include <QString>
class allitems
{
public:
allitems();
struct magazalar{
QString rev;
}kfc;
};
#endif // ALLITEMS_H
item.cpp
#include "allitems.h"
allitems::allitems()
{
kfc.rev="2";
}
现在我想从另一个cpp文件中获取kfc.rev的结果
void MainWindow::clicked(){
allitems aaa;
QPushButton *xx=(QPushButton *)sender();
//xx->objectName() returns "kfc"
qDebug()<<aaa.(xx->objectName()).rev;
}
我想用点击按钮调用kfc.rev。当我点击按钮按钮objectname是kfc我可以采取结果,但我无法实现从按钮对象名称调用结构数据
有什么想法解决它?
答案 0 :(得分:3)
你不能这样做:
qDebug()<<aaa.(xx->objectName()).kat;
它无效C ++,这个:(xx->objectName())
必须在编译时知道,而不是在运行时。如果要在运行时使其工作,则需要使用map或if语句:
这里你可以使用简单的if-s:
if (xx->objectName() == "kfc")
qDebug()<<aaa.kfc.kat;
//else if (xx->objectName() == "some_other_kfc")
// qDebug()<<aaa.some_other_kfc.kat;
但我不认为它是最好的设计,通常你会联系一个按钮,一个单击处理程序知道要修改哪个结构 - 而且它不需要从按钮实例中获取这些知识。
答案 1 :(得分:0)
使用sender()
通常会导致代码异味,并表示您应该做其他事情。
在现代C ++中,您可以在连接按钮时轻松生成必要的代码。我们假设aaa
是MainWindow
的成员:
MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
auto const clicked = &QPushButton::clicked;
connect(ui->kfc, clicked, [this]{ qDebug() << this->aaa.kfc.rev; });
//more connect statements here...
}