QT 主窗口中调用子窗口控件和信号传递

QT 主窗口中调用子窗口控件和信号传递

文件目录
Headers:
mainwindow.h
renderdialog.h
Souces:
main.cpp
mainwindow.cpp
rederdialog.cpp

实现:
由mainwindow菜单栏弹出dialog,该子窗口dialog中的buttonbox在按键ok/cancel后,mainwindow返回相应的值。
方法:
dialog的按键动作通过emit发送SIGNAL作为主窗口槽的触发信号,主窗口接收到子窗口SIGNAL信号后,触发SLOT信号,判断QAbstractButton格式的内容(ok/cancel)作响应。

该方法的要求如下:
在mainwindow.h要声明子窗口的RenderDialog类renderdialog,并定义响应的槽函数btnbox(QAbstractButton *),因为传送的信号类型就是QAbstractButton,用来判断buttonbox的内容ok/cancel.

mainwindow.h

#include "renderdialog.h"
#include "ui_renderdialog.h"

private:
    Ui::MainWindow *ui;
private:
    RenderDialog *renderdialog;
private slots:
//    void hellook();
//    void hellocancel();
	void btnbox(QAbstractButton *);//SLOT信号
	

mainwindow.cpp

//    connect(renderdialog,SIGNAL(buttonbox_ok()),this,SLOT(hellook()));
//    connect(renderdialog,SIGNAL(buttonbox_cancel()),this,SLOT(hellocancel()));
connect(renderdialog,SIGNAL(buttonbox(QAbstractButton *)),this,SLOT(btnbox(QAbstractButton *)));

/*
void MainWindow::hellook()
{
    qDebug()<<"okya";
}

void MainWindow::hellocancel()
{
    qDebug()<<"cancelya";
}
*/
void MainWindow::btnbox(QAbstractButton *button)
{
    if(button == renderdialog->ui->buttonBox->button(QDialogButtonBox::Ok))
    {
        qDebug()<<"ok";
    }else if(button == renderdialog->ui->buttonBox->button(QDialogButtonBox::Cancel))
    {
        qDebug()<<"cancel";
    }
}

该方法在renderdialog.h中,要将ui定义成公有才可在mainwindow中调用。定义signals void button(QAbstractButton *)作为传递信号,用来发送子窗口的信号,QAbstractButton要根据传送信号的格式来定义,这里是因为buttonbox控件的ok/cancel的格式而定。

renderdialog.h

private slots:
    void on_buttonBox_clicked(QAbstractButton *button);
public:
    Ui::RenderDialog *ui;
signals:
    void buttonbox(QAbstractButton *);
    

renderdialog的buttonbox在clicked()时通过emit发送传递的信号,如上文所述,然后在mainwindow.cpp通过connect得到renderdialog传递过来的QAbstractButton信号,然后将该信号在主窗口中进行判断即可。
rederdialog.cpp

void RenderDialog::on_buttonBox_clicked(QAbstractButton *button)
{

/*
    if(ui->buttonBox->button(QDialogButtonBox::Ok)==button)
    {
        emit buttonbox_ok();
        qDebug()<<"ok";
    }else if(ui->buttonBox->button(QDialogButtonBox::Cancel)==button)
    {
        emit buttonbox_cancel();
        qDebug()<<"cancel";
    }
*/
    emit buttonbox(button);
}

注释掉的代码大同小异,只是将buttonbox的ok/cancel分开发送,原理相同,只是为了学习中方便调试。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt窗口调用窗口函数可以通过信号与槽机制来实现。 首先,在窗口定义一个需要被窗口调用的函数。例如,窗口类为ChildWindow,函数为childFunction()。 窗口头文件ChildWindow.h添加以下代码: ```cpp signals: void callChildFunction(); public slots: void childFunction(); ``` 接下来,在窗口,需要实例化窗口的对象,并连接窗口信号窗口的槽函数。 窗口头文件MainWindow.h添加以下代码: ```cpp private slots: void onCallChildFunction(); ``` 窗口源文件MainWindow.cpp添加以下代码: ```cpp void MainWindow::onCallChildFunction() { childWindow->childFunction(); } ``` 最后,在窗口类的构造函数,进行窗口对象的创建,并连接信号与槽函数。 窗口源文件MainWindow.cpp添加以下代码: ```cpp MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { // 其他代码... childWindow = new ChildWindow(this); connect(this, &MainWindow::callChildFunction, childWindow, &ChildWindow::childFunction); } ``` 这样,当窗口需要调用窗口的函数时,只需要在窗口的槽函数onCallChildFunction()发射信号emit callChildFunction()即可。 总结起来,窗口调用窗口函数的步骤如下: 1. 在窗口定义需要被调用的函数。 2. 在窗口创建窗口对象,并连接信号与槽函数。 3. 在窗口类的槽函数发射窗口信号

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值