gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:00:23 25 4
gpt4 key购买 nike

我正在用 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 必须指向类/结构/union/通用类型”)。我该如何解决这个问题?作者承认他从来都不擅长 OOP,所以我很感激任何帮助。

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

最佳答案

假设您在 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() 和相关方法。

关于c++ - 如何在不出现 C2227 错误的情况下调用此方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21004477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com