2

我正在尝试使用 QSignalMapper 在单击时将信号发送器(QPushButton)发送到插槽。但它不起作用,我真的不知道为什么。

如果您知道执行此操作的不同方法,很高兴通知我,但我真的很想知道如何使用 QSignalMapper,因为它在将来会很有用。

电影库.h

    #ifndef MOVIEBASE_H
    #define MOVIEBASE_H

    #include <QtGui/QMainWindow>
    #include <Qt\qsignalmapper.h>

    #include "ui_moviebase.h"
    #include "include\DBAdapter.h"
    #include "include\objView.h"

    class MovieBase : public QMainWindow
    {

        Q_OBJECT

    public:
        MovieBase(QWidget *parent = 0, Qt::WFlags flags = 0);
        ~MovieBase();

    private:

        Ui::MovieBaseClass ui;

        DBAdapter *db;
        DBAdapter::Type type;
        QPushButton *buttonChecked;
        QSignalMapper *pushButtonMapper;

        void setMainButtonsFunct();


    private slots:
        void button_pushed(const QPushButton &);

    };

    #endif // MOVIEBASE_H

电影库.cpp

#include "moviebase.h"

MovieBase::MovieBase(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
    db = new DBAdapter();

    this->type = DBAdapter::Movie;

    this->setMainButtonsFunct();

    ObjView *obj = new ObjView(this->ui.objView);

    obj->view(db->get_All_Elements(this->type));
}

void MovieBase::setMainButtonsFunct()
{
    this->buttonChecked = ui.watchedButton;

    this->pushButtonMapper = new QSignalMapper(this);

    connect(this->ui.watchedButton, SIGNAL(clicked()), this->pushButtonMapper, SLOT(map()));
    connect(this->ui.towatchButton, SIGNAL(clicked()),  this->pushButtonMapper, SLOT(map()));
    connect(this->ui.availableButton, SIGNAL(clicked()),  this->pushButtonMapper, SLOT(map()));
    connect(this->ui.allButton, SIGNAL(clicked()),  this->pushButtonMapper, SLOT(map()));

    this->pushButtonMapper->setMapping(this->ui.watchedButton, this->ui.watchedButton);
    this->pushButtonMapper->setMapping(this->ui.towatchButton, this->ui.towatchButton);
    this->pushButtonMapper->setMapping(this->ui.availableButton, this->ui.availableButton);
    this->pushButtonMapper->setMapping(this->ui.allButton, this->ui.allButton);

    connect(this->pushButtonMapper, SIGNAL(mapped(const QPushButton &)), this, SLOT(button_pushed(const QPushButton &)));
}

void MovieBase::button_pushed(const QPushButton &sender)
{
    qDebug() << "button pushed";
    this->ui.watchedButton->setChecked(false);
}

MovieBase::~MovieBase()
{

}
4

2 回答 2

5

您只能使用 QSignalMapper 中存在的信号。没有这样的信号mapped(const QPushButton&)。使用mapped(QWidget*)并更改您的插槽以具有相同的签名:button_pushed(QWidget*).

于 2012-09-18T09:15:17.390 回答
0

看起来一切都很好。见编译器输出。也许你定义错误你的信号/槽签名

于 2012-09-18T09:29:20.007 回答