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

来源:互联网 发布:图像压缩算法 编辑:程序博客网 时间:2024/06/05 07:57

//customwnd.h
#ifndef __CUSTOM_WINDOW_H__
#define __CUSTOM_WINDOW_H__
#include <QApplication>
#include <QWidget>
#include <QMessageBox>
#include <QMenu>

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.2
QTVER = 4.3.1
ifeq($(QTVER), 3.3.2)
QTPATH = /usr/lib/qt-3.3.2
CFLAGS = -I$(QTPATH)/include
LDFALGS = -L$(QTPATH)/lib
LIBS = -lqt-mt
endif
ifeq($(QTVER), 4.3.1)
QTPATH = /usr/local/Trolltech/Qt-4.3.1
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

原创粉丝点击