如何在不出现 C2227 错误的情况下调用此方法?

Posted

技术标签:

【中文标题】如何在不出现 C2227 错误的情况下调用此方法?【英文标题】:How do I call this method without getting C2227 error? 【发布时间】:2014-01-08 19:11:41 【问题描述】:

我正在使用 C++11 编写 Qt 应用程序,并且我正在学习,所以这可能是一个答案非常明显的问题。我有一个应用程序,它用用户可以选择多个的缩略图(图片)填充主窗口中的图形场景。我正在尝试实现当用户单击一个时,先前的选择被清除的功能。由于鼠标点击事件发生在 pict 对象上,我试图让它告诉整个窗口取消选择其余部分。

这是 main.cpp:

#include "mainwindow.h"
#include <QApplication>
#include <QtGui>
#include <QtWidgets>



int main(int argc, char *argv[])

    QApplication a(argc, argv);
    MainWindow window;

    window.show();
    return a.exec();

这是 mainwindow.cpp 的摘录:

vector<Pict*> PictArray;  
vector<int> ActiveList;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);
    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);

    int viewwidth = ui->graphicsView->width();

    //test values
    int moment = 0;
    nitems = 47; 

    int maxitems_x = viewwidth/72; 
    int maxitems = 1000;
    if(nitems > maxitems)nitems = maxitems;

    PictArray.resize(nitems);

    //fill the scene
    int i = 0, j = 0, k = 0;
    while(true)
        PictArray[k] = new Pict(moment, k);         
        PictArray[k]->setPos(QPointF(i*72, j*72 + 16));        
        scene->addItem(PictArray[k]);
        i++;
        k++;
        if(i == maxitems_x)i=0; j++;
        if(k == nitems)break;
    

    qDebug() << "Drew" << nitems << "items" ;

    //test select some objects

    array<int, 4> v0_init = 3, 6, 9, 12;  //can't use list constructors with MSVC12)
    vector<int> v0(v0_init.begin(), v0_init.end());
    selectPicts(v0);


.
.
.

void MainWindow::deselectAllPicts()

    for(auto& i : ActiveList)
    
        PictArray[i]->setSelected(false);
    
    ActiveList.clear();

然后从pict对象,这个方法:

void Pict::mousePressEvent(QGraphicsSceneMouseEvent *event)
   
    window->deselectAllPicts();
    qDebug() << "selected: set " << this->s << " img " << this->n;
    this->color.setRed((qrand() % 256 + 255)/2);        //test: on click, set border to a random color
    this->color.setGreen((qrand() % 256  + 255)/2);
    this->color.setBlue((qrand() % 256 + 255)/2);
    this->isactive = true;
    update();
    QGraphicsItem::mousePressEvent(event);

但我收到错误 C2227(“->deselectAllPicts 必须指向类/结构/联合/泛型类型”)。我该如何解决这个问题?作者承认他从来都不擅长 OOP,所以我很感激任何帮助。

(我不打算将这一切都留在主窗口上 - 当我开始向窗口添加更多东西时,我将把场景变成一个自定义对象)

【问题讨论】:

windowPict 的数据成员吗?并且无需使用this-&gt; 来限定每个成员的访问权限 window 是如何定义的?基本上,错误表明-&gt;deselectAllPicts 的剩余部分必须是某种对象,具有可以访问的命名属性(不确定措辞是否最合适),但似乎不是。 “window”是main中定义的Mainwindow对象 @Bamako,是的,但是window 它在main() 的范围内并且不能从类中访问,您应该将它作为参数或其他东西传递。 我不使用 VS,但令人费解的是为什么它没有抱怨 window 根本没有在 Pict::mousePressEvent 范围内定义,因为它不是访问 a 的好类型成员。 【参考方案1】:

假设您在 Pict 类中重新实现了 QGraphicsItem,您可以向 Pict 构造函数添加一个额外的参数并将您的窗口传递给它:

PictArray[k] = new Pict(moment, k, this); // this in MainWindow refers to window itself

将此窗口指针存储在Pict构造函数中:

Pict::Pict(int moment, int k, MainWindow *window) : mainWindow(window), ... ...

然后从Pict访问主窗口:

mainWindow->deselectAllPicts();

编辑。您可以使用QGraphicsScene 机制简单地选择/取消选择/获取选定项目的列表。看看QGraphicsScene::setSelectionArea()和相关方法。

【讨论】:

以上是关于如何在不出现 C2227 错误的情况下调用此方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不出现 ORA-01460:未实现或不合理的转换错误的情况下将大字符串设置为参数?

在不执行 dllmain 函数的情况下加载 Dll

如何在不传递委托的情况下从 RootViewController 调用 AppDelegate 方法?

Easymock:如何在不可见的情况下模拟受保护方法的调用

如何在不调用 fixture.detectChanges() 的情况下绑定模板?

模拟 - 测试是否在不指定参数的情况下调用方法