您的位置:首页 > 编程语言 > Qt开发

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

2014-06-24 21:55 453 查看
//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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: