【问题标题】:Creating a timeout method in a gtkmm app causes "void value not ignored as it ought to be" error在 gtkmm 应用程序中创建超时方法会导致“不应忽略的无效值”错误
【发布时间】:2021-07-22 16:38:53
【问题描述】:

我刚刚开始使用 gtkmm,我正在尝试通过让超时方法调用我的 Update() 方法以预定义的时间间隔更新标签。但是,在我的 MainWindow 类的构造函数中编写以下行时:

Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWindow::Update), 1000);

我收到以下错误:

/usr/include/sigc++-2.0/sigc++/functors/slot.h:136:36: 错误: void 值没有被忽略,因为它应该被忽略 return (typed_rep->functor_)();

有没有人知道如何解决这个问题或原因是什么?

编辑: 这是一个最小且可重现的示例:

main.ccp

#include <gtkmm.h>
#include "MainWindow.h"

int main(int argc, char* argv[])
{
    auto app = Gtk::Application::create(argc, argv, "com.companyname.test");

    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("prototype.glade");

    MainWindow* mainWindow = 0;
    builder->get_widget_derived("mainWindow", mainWindow);

    return app->run(*mainWindow);
}

MainWindow.h

#pragma once
#include <gtkmm.h>

class MainWindow : public Gtk::Window
{
public:
    MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade);
    virtual ~MainWindow();

protected:
    //Signal handlers:
    void Update();
};

MainWindow.cpp

#include "MainWindow.h"
#include <iostream>

MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade)
{
    // The following line creates "void value not ignored as it ought to be (...)" error
    Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWindow::Update), 1000);
}

MainWindow::~MainWindow()
{

}

void MainWindow::Update()
{
    
    std::cout << "Update" << std::endl;
}

【问题讨论】:

  • 请移植minimal and reproducible example。比如MainWindow::Update后面的代码是什么?
  • 抱歉,现在添加!
  • 请看一下文档。Glib::SignalTimeoutsignal_timeout 需要 bool 类型的返回值,但您的处理程序 MainWindow::Updatevoid
  • 返回值的含义:如果timeout_handler()返回false处理程序断开。如果你不想这样,就不断返回true。如果您不喜欢更改 MainWindow::Update() 的签名,您也可以将处理程序包装到适配器 lambda 中:Glib::signal_timeout().connect(sigc::ptr_fun([this]() { Update(); return true; }), 1000);。 (我不能在我这边检查这个。带上一粒盐。)
  • 是的。我讨厌绑定并且喜欢适配器 lambdas。但是,Glib::signal_timeout().connect(sigc::bind_return(sigc::mem_fun(*this, &amp;MainWindow::Update), true), 1000); 当然也可以使用。

标签: c++ timeout gtk gtkmm


【解决方案1】:

正如 Scheff 在 cmets 中提到的,我忘记了 MainWindow::Update 需要返回一个 bool 类型的值,正如 signal_timeout 所期望的那样。将 Update 方法更改为以下,修复了问题:

bool MainWindow::Update()
{
    
    std::cout << "Update" << std::endl;
    
    return true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多