关于Qt中自定义槽和信号的简单示例

转载自http://blog.chinaunix.net/uid-10386087-id-2958968.html

//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();
}


我们可以用qmake -project;qmake让Qt tool自动生成Makefile, 但是习惯自己写Makefile的人看见自动生成Makefile中大堆的代码, 心里极度不爽, 下面给出一个Makefile模板.
//Makefile
#QTVER = 3.3
QTVER = 4.1.4

ifeq($(QTVER), 3.3)
QTPATH = /usr/lib/qt-3.3
CFLAGS = -I$(QTPATH)/include
LDFALGS = -L$(QTPATH)/lib 
LIBS = -lqt-mt
endif
ifeq($(QTVER), 4.1.4)
QTPATH = /usr/local/Trolltech/Qt-4.1.4
CFLAGS = -I$(QTPATH)/include -I$(QTPATH)/include/Qt -DQT3_SUPPORT
LDFALGS = -L$(QTPATH)/lib -L/usr/X11R6
LIBS = -lQtGui
endif

#moc 是Qt的工具
MOC = $(QTPATH)/bin/moc  #一定要注意, 如果同时存在几个版本的QT, 必须是用正确的moc工具, 否则在编译moc文件的时候,会出现莫名其妙的错误.
MOCOBJSUFFIX = moc.o
MOCSRCSUFFIX = moc.cpp
MOCOBJS = $(MOCHEADERS:%.h=%.$(MOCOBJSUFFIX))

BIN = test
OBJS = test.o customwindow.o
#如果类申明中有Q_OBJECT, 就将相应的头文件添加到MOCHEADERS中.
MOCHEADERS = custonwnd.h 

all:$(BIN)

$(BIN):$(OBJS) $(MOCOBJS)
    $(CXX) $(LDFLAGS) -o $@ $^ $(LIBS)

%.o:%.cpp
    $(CXX) $(CFLAGS) $(CXXFLAGS) -o $@ -c $<

#定义由 moc 文件生成 .o 文件的隐含规则
%.$(MOCOBJSUFFIX):%.$(MOCSRCSUFFIX)
    $(CXX) $(CFLAGS) $(CXXFLAGS) -o $@ -c $<

#定义由*.h生成 moc 文件的隐含规则
%.$(MOCSRCSUFFIX):%.h
    $(MOC) -o $@ $<

clean:
    $(RM) $(BIN) *.moc *.o

 
//customwnd.h
#ifndef __CUSTOM_WINDOW_H__
#define __CUSTOM_WINDOW_H__

#include 
#include 
#include 
#include 


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ÐźÅÊDZØÐëµÄ

    void sigTest(QString str);  //×Ô¶¨ÒåÐźÅ.

private:
    QPushButton *m_pus
QT信号机制是QT框架核心的一个特性。它提供了一种在对象之间进行通信的简洁、高效的方式。自定义信号是在QT扩展信号机制的一种方式,可以灵活地将自定义信号连接到相应的函数上。 在QT自定义信号示例可以如下所示: ```cpp #include <QObject> #include <QPushButton> class MyButton : public QPushButton { Q_OBJECT public: MyButton(QWidget *parent = nullptr) : QPushButton(parent) {} signals: void clickedWithMessage(const QString& message); // 自定义信号 public slots: void onClicked() // 函数 { emit clickedWithMessage("Button is clicked!"); // 发射自定义信号,并传递消息 } }; class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) { MyButton *button = new MyButton(this); connect(button, &MyButton::clickedWithMessage, this, &MyWidget::onButtonClicked); // 连接自定义信号函数 } public slots: void onButtonClicked(const QString& message) // 函数 { qDebug() << "Received message:" << message; } }; ``` 在这个示例,我们自定义了一个派生自QPushButton的类MyButton,并在其声明了一个自定义信号`clickedWithMessage`。当按钮被点击时,会发射该自定义信号,并传递一个消息。 然后,在MyWidget的构造函数,我们创建了一个MyButton实例,通过`connect`函数将该按钮的自定义信号与MyWidget的函数`onButtonClicked`进行连接。 当按钮被点击时,MyWidget的函数`onButtonClicked`会被调用,接收到传递的消息并打印出来。 通过自定义信号,我们可以自由地在不同的对象之间实现消息的传递与处理,使得代码更加模块化和可维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值