[转载]Qt自定义信号和槽

//customwnd.h  
#ifndef __CUSTOM_WINDOW_H__ 
#define __CUSTOM_WINDOW_H__   
#include "qapplication.h" 
#include "qwidget.h" 
#include "messagebox"
#include "qpopumenu.h"  
class CustomWnd:public QWidget
{     
  Q_OBJECT //如果要自定义槽和消息,必须在这里调用这个宏,否则自定义的槽和消息将不会起作用 public: CustomWnd(QWidget *parent = 0, const char *name = NULL); ~CustomWnd(); public slots: //自定义槽, 如果要自定义保护槽, 就声明为
protected slots:
  void btnMessage(); //自定义无参数槽.   void slotTest(QString); //自定义槽. signals:   //自定义信号, 如果要自定义保护信号, 就在protected: 后声明.   //自定义信号只需要在这里声明, 然后将槽连接到信号即可,无需实现信号函数.信号函数与槽函数的返回值类型在任何时候都可以不同; 而且如果不关心信号传递下来的参数, 信号函数与槽函数的参数列表也可以不相同, 但是如果要访问信号传递下来的任何  //参数时, 信号函数与槽函数的参数列表必须相同.   void explains(); //如果要自定义槽和信号, explains信号是必须的   void sigTest(QString str); //自定义信号. private:   QPushButton *m_pushBtnMsg;
}; #endif

//customwnd.cpp
CustomWnd::CustomWnd(QWidget *parent = 0, const char *name = NULL) :QWidget(parent, name)
{   m_pushBtnMsg = new QPushButton("MessageButton", this);
  m_pushBtnMsg->show();   connect(m_pushBtnMsg, SIGNAL(clicked()), this, SLOT(btnMessage())); //将自定义槽连接到内部信号, 这里就跟消息映射函数相似.   connect(this, SIGNAL(sigTest(QString)), this, SLOT(slotTest(QString))); //将自定义槽连接到自定义信号
}
CustomWnd::~CustomWnd()
{
  delete m_pushBtnMsg;
} void CustomWnd::btnMessage() {
  QMessageBox::warning(this, "WARNING", "just for test: will emit test signal");   emit sigTest(QString("Test Signal")); //发出自定义信号 } void CustomWnd::slotTest(QString str) {   QMessageBox::warning(this, "Customized signal test", str); }

//test.cpp
#include "customwnd.h" int main(int argc, char **argv) {   QApplication a(argc, argv);
  CustomWnd wnd;   a.setMainWidget(&wnd);   wnd.show();   return a.exec();

}

  

posted @ 2014-04-25 16:09  大山爸  阅读(4033)  评论(0)    收藏  举报