1. 程式人生 > >子視窗與父視窗互動

子視窗與父視窗互動

專案中一直想實現的功能子視窗dialog為檔案選擇視窗,選擇檔案點選確認關閉後,父視窗中開啟指定檔案。

是自己建的檔案視窗,沒有用到

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

所以只好自己摸索一下;

基本思路:

①在子視窗中宣告訊號 ②在主視窗中宣告並實現槽函式 ③在主視窗中connect繫結訊號和槽 ④子視窗中傳送訊號(emit)

程式碼:

子視窗宣告:

signals:

voidloadfilesignal(int
);
主視窗宣告:

publicslots:

voidopenfile()
主視窗槽函式:

voidMainWindow::openfile()

{
QImagetest;
test.load(Loadfile::open_filename);
f->resize(test.width(),test.height());
f->setPixmap(QPixmap::fromImage(test));
QFileInfofi(Loadfile::open_filename);
d->setText(fi.fileName());
qDebug()<<"open
file!";
qDebug()<<Loadfile::open_filename;
}
用於開啟指定圖片

主視窗繫結:

voidMainWindow::loadfile()

{
loadfile1=newLoadfile(this);
//不能在mainwindow的建構函式中繫結
connect(loadfile1,SIGNAL(loadfilesignal(int)),this,SLOT(openfile()));
loadfile1->show();
}
注意:

這個分析得很好

①connect()繫結函式,如果放到主視窗的建構函式中,此時,子視窗的類還沒新建物件,沒有分配記憶體地址,如果new一個物件,程式不會報錯(搜一下,有好新手跟我一樣有這個疑問),但是新建的子視窗物件與通過主視窗的點選按鈕後,新建的子視窗物件是兩碼事,在記憶體中是兩個不同的地址,我們要繫結的應該是後者與主視窗的訊號槽繫結,所以,connect函式應該放到主視窗點選子視窗按鈕程式碼裡面。 ②connect()繫結函式,如果放到子視窗的建構函式中,傳送用this,接收用主視窗指標,原理一樣,如果此處新建主視窗物件,然後建立連線,其實記憶體中有兩個主視窗物件了,繫結的並不是我想顯示日誌資訊的主視窗物件,此處可以直接調用出視窗已新建好物件的指標。 ③connect(),在子視窗和主視窗互動的過程中,其實放到哪裡不重要,重要的是傳送和接收的指標一定要是已新建好的主視窗/子視窗物件的指標,並且確保是新建好後再執行該connect()繫結函式。

子視窗發射訊號:

按下按鈕後觸發函式,發射訊號並關閉dialog

voidLoadfile::loadfiler()

{
    QString*fn=newQString;
//獲取選擇物件
QModelIndexnindex=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;
//上面是為了獲得所選檔案
emitLoadfile::loadfilesignal(1);//這裡!!!!!!!!!!!!
this->close();
}