首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接QSignalMapper QT 5.15.2

连接QSignalMapper QT 5.15.2
EN

Stack Overflow用户
提问于 2021-07-27 23:17:24
回答 1查看 227关注 0票数 0

我正在尝试将两个QPushButtons映射到openLanguageDialog(QPushButton *button)函数。我得到以下错误:

  • no matching member function for call to 'connect'
  • candidate function not viable: no known conversion from 'void (QAbstractButton::*)(bool)' to 'const char *' for 2nd argument
  • candidate function not viable: no known conversion from 'void (QAbstractButton::*)(bool)' to 'const QMetaMethod' for 2nd argument

我不知道如何解决这些错误,或者他们的意思是什么,一个解决方案或解释将是伟大的。

mainwindow.cpp

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_width(0)
{
    ui->setupUi(this);

    signalMapper = new QSignalMapper(this)

    QObject::connect(ui->translatedPushButton, &QPushButton::clicked, signalMapper,  &QSignalMapper::map);
    signalMapper->setMapping(ui->translatedPushButton, ui->translatedPushButton);
    QObject::connect(signalMapper, &QSignalMapper::mappedWidget, this, &MainWindow::openLanguageDialog);

    QObject::connect(ui->translationPushButton, &QPushButton::clicked, signalMapper,  &QSignalMapper::map);
    signalMapper->setMapping(ui->translationPushButton, ui->translationPushButton);
    QObject::connect(signalMapper, &QSignalMapper::mappedWidget, this, &MainWindow::openLanguageDialog);

}

void MainWindow::openLanguageDialog(QPushButton *button)
{
    QVector<QOnlineTranslator::Language> currentLang;
    languageDialog = std::make_unique<AddLanguageDialog>(currentLang, this);
    languageDialog->show();
    if (languageDialog->exec() == QDialog::Accepted)
    {
        button->setText(QVariant(languageDialog->languages()[0]).toString());
        setLanguage(languageDialog->languages()[0]);
    }
}

代码语言:javascript
复制
#include <QMainWindow>
#include <QSignalMapper>
#include "addlanguagedialog.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 public slots:
    void openLanguageDialog(QPushButton *button);
private:
    Ui::MainWindow *ui
    QSignalMapper *signalMapper;
    std::unique_ptr<AddLanguageDialog> languageDialog;
};
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-28 00:27:25

您有以下问题:

  • 由于存在信号和插槽重载,编译器无法理解连接中存在一个问题。

  • Qt不执行任何转换(强制转换),即使发送方是从QWidget.

继承的QPushButton对象。

  • 您不应该多次连接

解决办法是:

*.h

代码语言:javascript
复制
public slots:
   void openLanguageDialog(int id);

*.cpp

代码语言:javascript
复制
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    signalMapper = new QSignalMapper(this);
    connect(signalMapper, &QSignalMapper::mappedInt, this, &MainWindow::openLanguageDialog);

    connect(ui->translatedPushButton, &QAbstractButton::clicked, signalMapper, QOverload<>::of(&QSignalMapper::map));
    signalMapper->setMapping(ui->translatedPushButton, 0);

    connect(ui->translationPushButton, &QPushButton::clicked, signalMapper,  QOverload<>::of(&QSignalMapper::map));
    signalMapper->setMapping(ui->translationPushButton, 1);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::openLanguageDialog(int id)
{
    if(QPushButton *button = qobject_cast<QPushButton *>(signalMapper->mapping(id))){
        QVector<QOnlineTranslator::Language> currentLang;
        languageDialog = std::make_unique<AddLanguageDialog>(currentLang, this);
        languageDialog->show();
        if (languageDialog->exec() == QDialog::Accepted)
        {
            button->setText(QVariant(languageDialog->languages()[0]).toString());
            setLanguage(languageDialog->languages()[0]);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68552698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档