【问题标题】:Qt custom QPushButton clicked signalQt自定义QPushButton点击信号
【发布时间】:2016-01-08 02:30:11
【问题描述】:

我想将两个整数(string 和 fret)发送到一个 SLOT,该 SLOT 将处理按下按钮的位置。 SIGNAL 和 SLOT 参数必须匹配,所以我想我需要重新实现 QPushButton::clicked 事件方法。问题是我是 Qt 新手,可以使用一些方向。

connect(&fretBoardButton[string][fret], SIGNAL(clicked()), this, SLOT     (testSlot()));

【问题讨论】:

    标签: c++ qt qpushbutton qt-signals


    【解决方案1】:

    如果您使用C++11 connection syntax,您可以使用带有testSlot 调用的lambda 和stringfret 参数:

    connect(&fretBoard[string][fret], &QPushButton::clicked, [this, string, fret]() {
        testSlot(string, fret);
    });
    

    此代码使用[captures, ...](arguments, ...) { code } 语法创建一个lambda。当您建立连接时,它会捕获stringfret 变量值,然后在单击按钮时将它们传递给testSlot

    【讨论】:

    • 为了清楚起见,您需要 Qt 5 和 C++11 才能使用这种新语法。
    • 我添加了你的代码行。我收到一条错误消息,指出“没有为此 lambda 函数捕获'this'”。我从来没有使用过 lambda,所以我有点迷茫。更多信息: String 和 fret 在嵌套的 for 循环中迭代变量。函数头是 void MusicScales::testSlot(int s, int f)。在 GitHub 上:linkmusicscales.cpp 第 149 行
    • 我已经编辑了我的答案以捕获this,因此您可以调用成员函数。
    • 做到了。谢谢。
    • 我正在尝试按如下方式实现您的建议:connect(viewButton[currentAzon], &QPushButton::clicked, [this, currentAzon]() { tableModel->loginSlot(currentAzon); }); 但我收到一个错误:` 错误:'operator[]' 不匹配(操作数类型为 'QPushButton*' 和 'QString ')` 即使我使用的是 Qt 5 和 C++11。我错过了什么?
    【解决方案2】:

    您可以使用两种方法来添加琴弦和音品信息。一种是使用 sender() 函数来获取发出信号的按钮。如果它们是按钮类的成员,则可以访问音柱和字符串,因此在 SLOT 中您将拥有。

    MyPushButton *button = (MyPushButton *)sender();
    button.getFret();
    button.getString(); 
    

    但是,由于您已经对 QPushButton 进行了子类化,您可以使用私有 SLOT 来捕获 buttonClicked 信号并重新发出具有正确值的信号。

    在构造函数中

    connect(this, SIGNAL(clicked()), this, SLOT(reemitClicked()));
    

    然后是remit SLOT

    void MyPushButton::reemitClicked()
    {
        emit clicked(m_fret, m_string);
    }
    

    请务必为您的班级添加适当的私人插槽和公共信号 https://doc.qt.io/archives/qq/qq10-signalmapper.html 请参阅这篇文章,了解有关向信号添加参数的各种方法的良好讨论。

    【讨论】:

    • 很棒的链接!我正在考虑类似的事情,但对子类化 QPushButton 的想法冻结了。谢谢。
    猜你喜欢
    • 2013-04-24
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多