
使用自定义带参和无参信号和槽函数实现子窗口和主窗口的切换
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条)