成品
类结构
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); });