有时候我们需要在子窗口中通过一些事件(发送一些信号,或者按钮点击事件)来改变主窗口中的UI状态,比如更改主窗口中label,LineEdit等的内容,或者是串口接收到信号向主窗口回复,主窗口更改信号灯(UI)颜色来实现“信号可视化”,那么如何来调用主窗口中的控件呢?
代码部分
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "userwidget.h"//引用 用户界面头文件
#include "ui_userwidget.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void changeText(int num);//调用UI函数
userwidget * userw = NULL;//用来保存用户界面实例化对象地址
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
userw = new userwidget();//实例化用户界面对象
//注意:不能将this父窗口的指针直接传给子窗口 例如:userw = new userwidget(this);
userw->getWidget(this); //写一个接口函数将父窗口传给子窗口
connect(ui->pushButton,&QPushButton::clicked,[=](){
//this->hide();
userw->show();
});
//接收用户界面的返回信号
/*connect(this->userw,&userwidget::back,[=](){
//this->userw->hide();
//this->show();
});*/
}
Widget::~Widget()
{
delete ui;
}
//自定义函数 调用UI
void Widget::changeText(int num)
{
switch(num)
{
case 1:
ui->lineEdit->setText("我是第一名!");
break;
case 2:
ui->lineEdit->setText("我是第二名!");
break;
case 3:
ui->lineEdit->setText("我是第三名!");
break;
default:
break;
}
}
userwidget.h
#ifndef USERWIDGET_H
#define USERWIDGET_H
#include <QWidget>
class Widget;//主窗口声明
namespace Ui {
class userwidget;
}
class userwidget : public QWidget
{
Q_OBJECT
public:
explicit userwidget(QWidget *parent = nullptr);
~userwidget();
//主函数调用 将主窗口给到子窗口
void getWidget(Widget * pWidget)
{
wi = pWidget;
}
//signals:
// void back();//定义一个信号
private slots:
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
private:
Ui::userwidget *ui;
Widget *wi;
};
#endif // USERWIDGET_H
userwidget.cpp
#include "userwidget.h"
#include "ui_userwidget.h"
#include <QPushButton>
#include <QDebug>
#include "widget.h"
userwidget::userwidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::userwidget)
{
ui->setupUi(this);
/*
connect(ui->pushButton,&QPushButton::clicked,[=](){
//发信号给主界面
emit this->back();
});
*/
//将传过来的父窗口进行强制类型转换
//wi = static_cast<Widget*>(parent);
}
userwidget::~userwidget()
{
delete ui;
}
void userwidget::on_pushButton_2_clicked()
{
wi->changeText(1);
}
void userwidget::on_pushButton_3_clicked()
{
wi->changeText(2);
}
void userwidget::on_pushButton_4_clicked()
{
wi->changeText(3);
}
初次编写,有疑问的可以在评论提出,谢谢!