qt label显示文字_Qt官方示例共享内存
這個(gè)例子展示了如何使用QSharedMemory類(共享內(nèi)存)進(jìn)行進(jìn)程間通信。
??構(gòu)建示例,請運(yùn)行make。要運(yùn)行該示例,請運(yùn)行兩個(gè)實(shí)例。main()函數(shù)創(chuàng)建一個(gè)應(yīng)用程序和我們示例的Dialog類的實(shí)例。顯示對話框,然后將控制以標(biāo)準(zhǔn)方式傳遞給應(yīng)用程序。
int?main(int?argc,?char?*argv[]){????QApplication?application(argc,?argv);
????Dialog?dialog;
????dialog.show();
????return?application.exec();
}
??展示Dialog類的兩個(gè)實(shí)例。共享內(nèi)存示例的屏幕截圖?
共享內(nèi)存示例的屏幕截圖??Dialog類繼承QDialog。它封裝了用戶界面和QSharedMemory實(shí)例。它還具有兩個(gè)公有槽函數(shù),分別是loadFromFile()和loadFromMemory(),它們對應(yīng)于對話框上的兩個(gè)按鈕。
class?Dialog?:?public?QDialog{
????Q_OBJECT
??public:
????Dialog(QWidget?*parent?=?nullptr);
??public?slots:
????void?loadFromFile();
????void?loadFromMemory();
?private:
????void?detach();
??private:
????Ui::Dialog?ui;
????QSharedMemory?sharedMemory;
};
??構(gòu)造函數(shù)將構(gòu)建用戶界面小部件,并將每個(gè)按鈕的clicked()信號連接到相應(yīng)的槽函數(shù)。
Dialog::Dialog(QWidget?*parent)??:?QDialog(parent),?sharedMemory("QSharedMemoryExample")
{
????ui.setupUi(this);
????connect(ui.loadFromFileButton,?&QPushButton::clicked,
????????????this,?&Dialog::loadFromFile);
????connect(ui.loadFromSharedMemoryButton,?&QPushButton::clicked,
????????????this,?&Dialog::loadFromMemory);
????setWindowTitle(tr("SharedMemory?Example"));
}
??請注意,"QSharedMemoryExample"將傳遞給QSharedMemory()構(gòu)造函數(shù)以用作鍵值。系統(tǒng)會將其用作基礎(chǔ)共享內(nèi)存段的標(biāo)識符。
??單擊Load Image From File...按鈕,會調(diào)用loadFromFile()槽函數(shù)。首先,它測試共享內(nèi)存段是否已附加到該進(jìn)程。如果是這樣,則該段將從過程中分離出來,因此可以確保我們正確地開始執(zhí)行該示例。
void?Dialog::loadFromFile(){????if?(sharedMemory.isAttached())
????????detach();
????ui.label->setText(tr("Select?an?image?file"));
????QString?fileName?=?QFileDialog::getOpenFileName(0,?QString(),?QString(),
????????????????????????????????????????tr("Images?(*.png?*.xpm?*.jpg)"));
????QImage?image;
????if?(!image.load(fileName))?{
????????ui.label->setText(tr("Selected?file?is?not?an?image,?please?select?another."));
????????return;
????}
????ui.label->setPixmap(QPixmap::fromImage(image));
??然后要求用戶使用QFileDialog::getOpenFileName()選擇圖像文件。所選文件被加載到QImage中。使用QImage可以確保所選文件是有效圖像,還可以使用setPixmap()在對話框中立即顯示該圖像。
??接下來,使用QDataStream將圖像流式傳輸?shù)絈Buffer中。設(shè)置大小,然后我們將其用于create()我們的共享內(nèi)存段。創(chuàng)建共享內(nèi)存段會自動將該段附加到進(jìn)程。在這里使用QBuffer可使我們獲得指向圖像數(shù)據(jù)的指針,然后將其用于從QBuffer到共享內(nèi)存段的memcopy()。
????//?load?into?shared?memory????QBuffer?buffer;
????buffer.open(QBuffer::ReadWrite);
????QDataStream?out(&buffer);
????out?<????int?size?=?buffer.size();
????if?(!sharedMemory.create(size))?{
????????ui.label->setText(tr("Unable?to?create?shared?memory?segment."));
????????return;
????}
????sharedMemory.lock();
????char?*to?=?(char*)sharedMemory.data();
????const?char?*from?=?buffer.data().data();
????memcpy(to,?from,?qMin(sharedMemory.size(),?size));
????sharedMemory.unlock();
}
??請注意,在復(fù)制到共享內(nèi)存段之前,我們先對其進(jìn)行l(wèi)ock(),然后在復(fù)制后立即再次對其進(jìn)行unlock()。這樣可以確保我們擁有對共享內(nèi)存段的獨(dú)占訪問權(quán)來執(zhí)行我們的memcopy()。如果某個(gè)其他進(jìn)程具有段鎖,則我們的進(jìn)程將阻塞,直到該鎖可用為止。
??還要注意,該函數(shù)不會在memcopy()和unlock()之后從共享內(nèi)存段中detach()。回想一下,當(dāng)最后一個(gè)進(jìn)程從共享內(nèi)存段中分離時(shí),該段將由操作系統(tǒng)釋放。由于此過程目前僅連接到共享內(nèi)存段,因此,如果loadFromFile()從共享內(nèi)存段分離,則該段將被銷毀,然后再進(jìn)行下一步。
??函數(shù)返回時(shí),如果您選擇的文件是qt.png,則第一個(gè)對話框如下所示。
void?Dialog::loadFromMemory(){????if?(!sharedMemory.attach())?{
????????ui.label->setText(tr("Unable?to?attach?to?shared?memory?segment.\n"?\
?????????????????????????????"Load?an?image?first."));
????????return;
????}
????QBuffer?buffer;
????QDataStream?in(&buffer);
????QImage?image;
????sharedMemory.lock();
????buffer.setData((char*)sharedMemory.constData(),?sharedMemory.size());
????buffer.open(QBuffer::ReadOnly);
????in?>>?image;
????sharedMemory.unlock();
????sharedMemory.detach();
????ui.label->setPixmap(QPixmap::fromImage(image));
}
??在這種情況下,該函數(shù)會從該段執(zhí)行detach(),因?yàn)楝F(xiàn)在我們已經(jīng)有效地完成了對它的使用。最后,顯示QImage。此時(shí),兩個(gè)對話框都應(yīng)顯示相同的圖像。當(dāng)關(guān)閉第一個(gè)對話框時(shí),對話框析構(gòu)函數(shù)調(diào)用QSharedMemory析構(gòu)函數(shù),該析構(gòu)函數(shù)與共享內(nèi)存段分離。由于這是要從該段分離的最后一個(gè)進(jìn)程,因此操作系統(tǒng)現(xiàn)在將釋放共享內(nèi)存。
關(guān)于更多
在QtCreator軟件可以找到:
或在 以下Qt安裝目錄找到:
- 相關(guān)鏈接
Qt君公眾號回復(fù)"入群"后,在群文件獲取本示例代碼。
Qt君公眾號回復(fù)『Qt示例』獲取更多內(nèi)容。
總結(jié)
以上是生活随笔為你收集整理的qt label显示文字_Qt官方示例共享内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 60秒计时器的仿真电路_物联网应用基于A
- 下一篇: mysql内置多个数据存储引擎_一个my