作者: ChinaUnix


                
       

//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