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

时间:2014-01-08 19:11:41

标签: c++ qt c++11

我正在用C ++ 11编写一个Qt应用程序,我正在学习,所以这可能是一个非常明显答案的问题。我有一个应用程序在主窗口填充图形场景,缩略图(picts),用户可以选择多个。我正在尝试实现一种功能,当用户点击一个时,前一个选择被清除。由于鼠标点击事件发生在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(“ - &gt; deselectAllPicts必须指向类/ struct / union / generic类型”)。我该如何解决这个问题?作者承认他从不擅长OOP,所以我感谢任何帮助。

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

1 个答案:

答案 0 :(得分:2)

假设您在QGraphicsItem类中重新实现了Pict,您可以向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();

编辑。 P.S.您只需选择/取消选择/获取具有QGraphicsScene机制的所选项目列表。查看QGraphicsScene::setSelectionArea()及相关方法。