QSignalMapper类实现点击按钮跳转栈窗口

成品

QSignalMapper类实现点击按钮跳转栈窗口

类结构

QSignalMapper类实现点击按钮跳转栈窗口

 

 buttongroup.h

enum Page{MYFILE, SHARE,  TRANSFER};
class buttongroup : public QWidget
{
    Q_OBJECT

public:
    explicit buttongroup(QWidget *parent = nullptr);
    ~buttongroup();
    void init();
public slots:
    void slotButtonClick(QString);

signals:
    void gotomyfile();
    void gotoshared();
    void gototransfer();
private:
    Ui::buttongroup *ui;
    QSignalMapper *m_mapper;   //定义一个信号映射类
    QPushButton * m_curbtn;
    QMap<QString,QPushButton*> m_btns;
    QMap<Page,QString> m_pages;


};

buttongroup.cpp

在构造函数中添加代码

    m_curbtn=ui->btn_myfile;  
    m_mapper=new QSignalMapper;
    m_btns.insert(ui->btn_myfile->text(),ui->btn_myfile); //key->我的文件  value->某个按钮指针
    m_btns.insert(ui->btn_shared->text(),ui->btn_shared);
    m_btns.insert(ui->btn_transfer->text(),ui->btn_transfer);

    m_pages.insert(MYFILE,ui->btn_myfile->text());
    m_pages.insert(SHARE,ui->btn_shared->text());
    m_pages.insert(TRANSFER,ui->btn_transfer->text());

    auto it = m_btns.begin();
    for(;it!=m_btns.end();++it)  //依次从容器中取出元素,设置他们的映射关系  如 btn_myfile<--->我的文件
    {
        m_mapper->setMapping(it.value(),it.value()->text());
//点击按钮的信号交由mapper处理            connect(it.value(),SIGNAL(clicked(bool)),m_mapper,SLOT(map()));
    }
      //mapper发出信号,由自定义槽函数处理,这里的QString 与setMapping函数的第二个参数对应
     connect(m_mapper, SIGNAL(mapped(QString)), this, SLOT(slotButtonClick(QString)));

自定义槽函数

void buttongroup::slotButtonClick(QString text)
{
    QPushButton *btn=m_btns[text];
    if(btn==m_curbtn)
        return;
    m_curbtn=btn;
    //发信号
    if(text==ui->btn_myfile->text())
    {
        emit gotomyfile();
    }else if(text==ui->btn_shared->text())
    {
         emit gotoshared();
    }else if(text==ui->btn_transfer->text())
    {
        emit gototransfer();
    }
}

这些发送跳转的信号,由mainwindow类中的信号和槽处理。

    connect(ui->btn_group,&buttongroup::gotoshared,[=](){
        ui->stackedWidget->setCurrentWidget(ui->page_shared);
    });

 

QSignalMapper类实现点击按钮跳转栈窗口

上一篇:#axios 拦截器 取消请求,#axios interceptors.request cancel a http request #使用axios在request拦截器中取消请求


下一篇:NCF 如何写支付宝支付中的APP支付