如何在不出现C2227错误的情况下调用此方法
How do I call this method without getting C2227 error?
我正在用C++11编写一个Qt应用程序,我正在边学习边学习,所以这可能是一个答案非常明显的问题。我有一个应用程序,它用缩略图(picts)填充主窗口中的图形场景,用户可以选择多个缩略图。我正在尝试实现这样的功能,即当用户单击某个选项时,先前的选择将被清除。由于鼠标点击事件发生在pict对象上,我试图让它告诉整个窗口取消选择其余部分
这是主要的.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,所以我很感激任何帮助。
(我不打算把这一切都留在主窗口上——当我开始在窗口中添加更多的东西时,我会把场景变成一个自定义对象)
假设您在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();
编辑P.S.您可以使用QGraphicsScene
机制简单地选择/取消选择/获得所选项目的列表。看看QGraphicsScene::setSelectionArea()
和相关方法。
相关文章:
- 特定情况下的分段错误
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 如何在没有打印语句的情况下报告用户输入错误
- 在最坏的情况下试验快速排序.它运行良好,但在最坏的情况下发生未知错误.我想
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 调整向量大小并检索值,这是否正确或在任何情况下都可能导致段错误?
- 如果 return 语句在带括号的循环中,错误可能会到达非 void 函数的末尾,但不会显示在没有括号的循环的情况下
- 我需要在不使用前向声明的情况下相互包含两个头文件,导致"incomplete type"错误
- 在存在错误代码的情况下输出参数与 NRVO
- 对象无法访问其私人数据.错误:在这种情况下私有
- 在这种情况下如何解决?语法错误:在"* "node" ?
- 如何编写一个通用函数,该通用函数在没有任何条件和条件的情况下工作(无论是真实和错误)
- 错误:在 DLSYSM 的情况下,从“void*”到“void (*)()”的转换无效
- 我的调试器说我有一个隔离错误错误,但无法告诉我在哪里,在非常特殊的情况下发生
- 为什么在这种情况下编制动态库错误
- 即使我传递了无效的类型参数,我为什么还能在没有错误的情况下编译此代码
- 呼叫send()关闭申请的情况下没有错误
- 如何在没有错误的情况下展示特殊的中文,韩语,日本角色
- 获取和设置内部数据:返回类型,错误情况下的行为
- 如何处理错误情况下的对象销毁与非错误情况