项目中一直想实现的功能子窗口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();
}