【问题标题】:C++ issue, returning a function. Error expected-primary expression before '*' tokenC++ 问题,返回一个函数。 '*' 标记之前的错误预期主表达式
【发布时间】:2012-12-30 20:15:15
【问题描述】:

我无法弄清楚为什么我无法返回我的函数。有任何想法吗?

我得到的错误是; '*' 标记和 ')' 标记之前的预期主表达式。

(不确定这是 C++ 还是 Qt 错误,我不是这两个方面的专家)

int MainWindow::createPacket(const QString &source)

    {
        QGraphicsView *editor = new QGraphicsView;
        int tabIndex = packet->addTab(editor, source); 
        packet->setCurrentIndex(tabIndex);

        return paintEvent(QPaintEvent*); <<<<<<<<< The line the error appears on.
    }

    void MainWindow::paintEvent(QPaintEvent*)
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setPen(Qt::black);

        QRect rect = QRect(10, 20, 70, 40);
        painter.drawText(rect, Qt::AlignCenter,
                         "Source");
        painter.drawRect(rect);
    }

【问题讨论】:

    标签: c++ qt4


    【解决方案1】:

    QPaintEvent* 是一种类型。当你调用一个函数时,你不会将对象作为参数传递,而不是类型。

    另外,由于paintEvent 的参数没有命名,也没有使用,为什么它存在呢?为什么不简单地使用:

    void MainWindow::paintEvent()
    {
       //...
    }
    

    代码无效,我无法想象它是如何工作的,或者您期望发生什么。这是基本的东西,在你开始使用 Qt 之前,我建议你先学习 C++(这并不意味着居高临下,只是一个建议)。

    一个有效的调用将是,例如:

    QPaintEvent* qpaintEventPointer = NULL;
    paintEvent(qpaintEventPointer);
    

    但这是无效的,因为paintEvent 返回void,而调用上下文返回int

    要返回一个函数本身,你需要返回一个函数指针,而不是像你一样的int,而且你不需要完整的签名,只需要一个return paintEvent...

    Bottom line.

    【讨论】:

    • @LightnessRacesinOrbit 没关系,因为它没有在函数内部使用。
    • 你发送给它的函数不接受它的引用,那么有什么意义呢?另外我认为从技术上讲这是 UB,因为复制它正在使用它。
    • 感谢您的建议,我将参数设置为paintEvent 的原因是由于之前的错误说QPainter 在不包含参数时不活动。 (固定一段时间)。正如我所说,我不是 C++ 专家,已经学习了 1 年。我只是想将它与一些图形结合起来。不过谢谢:)
    • @LightnessRacesinOrbit 你确定吗?我不认为它只是复制它的UB。只要不被取消引用就可以了。
    • 它在 C++98、C++03 和 C++11 中是未定义的,但这是一个缺陷。它是在最新的 WP 中实现定义的,请参阅 open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1438,大多数实现可能会证明只要不取消引用,就可以复制无效指针。
    【解决方案2】:

    即使您正确调用了MainWindow::paintEvent(),此函数也不会返回任何内容,并且应该在系统需要绘制您的小部件时自动调用(参见documentation

    我不确定您要做什么,但要触发重绘,您需要调用 repaint(),而不是 paintEvent()。

    【讨论】:

    • 也许我为我想做的事情使用了错误的小部件。我会重新考虑。
    • 注意:repaint() 是同步的。如果您想安排绘画活动,请使用update() instaed。
    • 我想离开 PaintEvent *。我没有用它(如所指出的^^^)。我只想使用 QPainter 绘制一个矩形。谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 2012-07-08
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多