子窗口与父窗口交互

来源:互联网 发布:淘宝s挂钩 编辑:程序博客网 时间:2024/05/16 07:36

项目中一直想实现的功能子窗口dialog为文件选择窗口,选择文件点击确认关闭后,父窗口中打开指定文件。

是自己建的文件窗口,没有用到

Qstring fileName = QFileDialog::getOpenFileName(this, tr("open file"), " ",  tr("Allfile(*.*);;mp3file(*.mp3)")); 

所以只好自己摸索一下;

基本思路:

①在子窗口中声明信号
②在主窗口中声明并实现槽函数
③在主窗口中connect绑定信号和槽
④子窗口中发送信号(emit)

代码:

子窗口声明:

signals:

    void loadfilesignal(int);
主窗口声明:

public slots:

    void openfile()
主窗口槽函数:

void MainWindow::openfile()

{
    QImage test;
    test.load(Loadfile::open_filename);
    f->resize(test.width(),test.height());
    f->setPixmap(QPixmap::fromImage(test));
    QFileInfo fi(Loadfile::open_filename);
    d->setText(fi.fileName());
    qDebug()<<"open file !";
    qDebug()<<Loadfile::open_filename;
}
用于打开指定图片

主窗口绑定:

void MainWindow::loadfile()

{
    loadfile1 = new Loadfile(this);
    //不能在mainwindow的构造函数中绑定
    connect(loadfile1,SIGNAL(loadfilesignal(int)),this,SLOT(openfile()));
    loadfile1->show();
}
注意:

这个分析得很好

①connect()绑定函数,如果放到主窗口的构造函数中,此时,子窗口的类还没新建对象,没有分配内存地址,如果new一个对象,程序不会报错(搜一下,有好新手跟我一样有这个疑问),但是新建的子窗口对象与通过主窗口的点击按钮后,新建的子窗口对象是两码事,在内存中是两个不同的地址,我们要绑定的应该是后者与主窗口的信号槽绑定,所以,connect函数应该放到主窗口点击子窗口按钮代码里面。
②connect()绑定函数,如果放到子窗口的构造函数中,发送用this,接收用主窗口指针,原理一样,如果此处新建主窗口对象,然后建立连接,其实内存中有两个主窗口对象了,绑定的并不是我想显示日志信息的主窗口对象,此处可以直接调用出窗口已新建好对象的指针。
③connect(),在子窗口和主窗口交互的过程中,其实放到哪里不重要,重要的是发送和接收的指针一定要是已新建好的主窗口/子窗口对象的指针,并且确保是新建好后再执行该connect()绑定函数。

子窗口发射信号:

按下按钮后触发函数,发射信号并关闭dialog

void Loadfile::loadfiler()

{     QString *fn = new QString;
    //获取选择对象
    QModelIndex nindex = ui->treeView->currentIndex() ;//currentindex这个函数不知哪里来的
    if(pathvalue){
    *fn = local_model->filePath(nindex);
    }
    else
        *fn = move_model->filePath(nindex);
    //加工变量
    open_filename.clear();
    open_filename.append(*fn);
//    qDebug()<<"loadfiler"+open_filename;
//上面是为了获得所选文件
    emit Loadfile::loadfilesignal(1);//这里!!!!!!!!!!!!
    this->close();
}

原创粉丝点击