使用自定义带参和无参信号和槽函数实现子窗口和主窗口的切换
childwidget.hchildwidget.cppmywidget.hmywidget.cppmain.cpp 信号、槽和链接函数(connect)知识点总结效果演示
参考Qt学习笔记(二):信号和槽
使用自定义带参和无参信号和槽函数实现子窗口和主窗口的切换childwidget是子窗口实现逻辑,mywidget是主窗口实现逻辑。
childwidget.h#ifndef CHILDWIDGET_H #define CHILDWIDGET_H #includechildwidget.cpp#include #include class ChildWidget : public QWidget { Q_OBJECT public: explicit ChildWidget(QWidget *parent=0); signals: // 自定义信号(有参无参) void mySignal(); void mySignal(int,QString); public slots: // 自定义处理btn请求的槽函数 void sendSignal(); private: QPushButton btn; }; #endif
#include "childwidget.h" ChildWidget::ChildWidget(QWidget *parent):QWidget(parent){ // 子窗口大小调整 this->resize(400,300); // 子窗口标题 this->setWindowTitle("child window"); // 设置btn的父窗口 btn.setParent(this); // 按钮显示样例 btn.setText("to main window"); // 移动btn到(200,100) btn.move(200,100); // 链接信号和槽函数 connect(&btn,&QPushButton::clicked,this,&ChildWidget::sendSignal); } void ChildWidget::sendSignal() { // 发送信号 emit是发送信号关键字 emit mySignal(); emit mySignal(110, "I am a child window"); }mywidget.h
#ifndef MYWIDGET_H #define MYWIDGET_H #includemywidget.cpp#include #include "childwidget.h" #include #include #include //using namespace std; class MyWidget :public QWidget { Q_OBJECT public: MyWidget(QWidget* parent = 0); ~MyWidget(); void mySlot(); void dealSignal(); void dealSignal(int,QString); private: QPushButton b1; QPushButton* b2; // 将子窗口对象声明 ChildWidget child; }; #endif
#include "mywidget.h" MyWidget::MyWidget(QWidget *parent):QWidget(parent) { this->resize(400, 300); this->setWindowTitle("main window"); b1.setParent(this); b1.setText("to child window"); b1.move(200, 100); // 使用函数指针指向重载函数,避免二义性 void (ChildWidget::*noParamSignal)(void) = &ChildWidget::mySignal; void (MyWidget:: * noParamSlot)(void) = &MyWidget::dealSignal; void (ChildWidget:: * haveParamSignal)(int, QString) = &ChildWidget::mySignal; void (MyWidget:: * haveParamSlot)(int, QString) = &MyWidget::dealSignal; connect(&b1,&QPushButton::clicked,this,&MyWidget::mySlot); // 子窗口和主窗口互相切换 connect(&child, noParamSignal, this, noParamSlot); connect(&child, haveParamSignal, this, haveParamSlot); } MyWidget::~MyWidget() { } void MyWidget::mySlot() { this->hide(); child.show(); } void MyWidget::dealSignal() { this->show(); child.hide(); } void MyWidget::dealSignal(int a,QString str) { qDebug() << "a=" << a << " str=" << str; }main.cpp
#include "QtWidgetsApplication1.h" #include信号、槽和链接函数(connect)知识点总结#include "mywidget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QtWidgetsApplication1 w; MyWidget h; h.show(); //w.show(); return a.exec(); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)