日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

qt label显示文字_Qt官方示例共享内存

發(fā)布時(shí)間:2025/3/21 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt label显示文字_Qt官方示例共享内存 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這個(gè)例子展示了如何使用QSharedMemory類(lèi)(共享內(nèi)存)進(jìn)行進(jìn)程間通信。

??構(gòu)建示例,請(qǐng)運(yùn)行make。要運(yùn)行該示例,請(qǐng)運(yùn)行兩個(gè)實(shí)例。main()函數(shù)創(chuàng)建一個(gè)應(yīng)用程序和我們示例的Dialog類(lèi)的實(shí)例。顯示對(duì)話框,然后將控制以標(biāo)準(zhǔn)方式傳遞給應(yīng)用程序。

int?main(int?argc,?char?*argv[]){
????QApplication?application(argc,?argv);
????Dialog?dialog;
????dialog.show();
????return?application.exec();
}

??展示Dialog類(lèi)的兩個(gè)實(shí)例。共享內(nèi)存示例的屏幕截圖?

共享內(nèi)存示例的屏幕截圖

??Dialog類(lèi)繼承QDialog。它封裝了用戶(hù)界面和QSharedMemory實(shí)例。它還具有兩個(gè)公有槽函數(shù),分別是loadFromFile()和loadFromMemory(),它們對(duì)應(yīng)于對(duì)話框上的兩個(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)建用戶(hù)界面小部件,并將每個(gè)按鈕的clicked()信號(hào)連接到相應(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"));
}

??請(qǐng)注意,"QSharedMemoryExample"將傳遞給QSharedMemory()構(gòu)造函數(shù)以用作鍵值。系統(tǒng)會(huì)將其用作基礎(chǔ)共享內(nèi)存段的標(biāo)識(shí)符。

??單擊Load Image From File...按鈕,會(huì)調(diào)用loadFromFile()槽函數(shù)。首先,它測(cè)試共享內(nèi)存段是否已附加到該進(jìn)程。如果是這樣,則該段將從過(guò)程中分離出來(lái),因此可以確保我們正確地開(kāi)始執(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));

??然后要求用戶(hù)使用QFileDialog::getOpenFileName()選擇圖像文件。所選文件被加載到QImage中。使用QImage可以確保所選文件是有效圖像,還可以使用setPixmap()在對(duì)話框中立即顯示該圖像。

??接下來(lái),使用QDataStream將圖像流式傳輸?shù)絈Buffer中。設(shè)置大小,然后我們將其用于create()我們的共享內(nèi)存段。創(chuàng)建共享內(nèi)存段會(huì)自動(dòng)將該段附加到進(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();
}

??請(qǐng)注意,在復(fù)制到共享內(nèi)存段之前,我們先對(duì)其進(jìn)行l(wèi)ock(),然后在復(fù)制后立即再次對(duì)其進(jìn)行unlock()。這樣可以確保我們擁有對(duì)共享內(nèi)存段的獨(dú)占訪問(wèn)權(quán)來(lái)執(zhí)行我們的memcopy()。如果某個(gè)其他進(jìn)程具有段鎖,則我們的進(jìn)程將阻塞,直到該鎖可用為止。

??還要注意,該函數(shù)不會(huì)在memcopy()和unlock()之后從共享內(nèi)存段中detach()。回想一下,當(dāng)最后一個(gè)進(jìn)程從共享內(nèi)存段中分離時(shí),該段將由操作系統(tǒng)釋放。由于此過(guò)程目前僅連接到共享內(nèi)存段,因此,如果loadFromFile()從共享內(nèi)存段分離,則該段將被銷(xiāo)毀,然后再進(jìn)行下一步。

??函數(shù)返回時(shí),如果您選擇的文件是qt.png,則第一個(gè)對(duì)話框如下所示。

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ù)會(huì)從該段執(zhí)行detach(),因?yàn)楝F(xiàn)在我們已經(jīng)有效地完成了對(duì)它的使用。最后,顯示QImage。此時(shí),兩個(gè)對(duì)話框都應(yīng)顯示相同的圖像。當(dāng)關(guān)閉第一個(gè)對(duì)話框時(shí),對(duì)話框析構(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安裝目錄找到:

C:\Qt\{你的Qt版本}\Examples\{你的Qt版本}\corelib\ipc\sharedmemory
  • 相關(guān)鏈接
https://doc.qt.io/qt-5/qtcore-ipc-sharedmemory-example.html
  • Qt君公眾號(hào)回復(fù)"入群"后,在群文件獲取本示例代碼。

  • Qt君公眾號(hào)回復(fù)『Qt示例』獲取更多內(nèi)容。

總結(jié)

以上是生活随笔為你收集整理的qt label显示文字_Qt官方示例共享内存的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。