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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/21 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt label显示文字_Qt官方示例共享内存 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這個例子展示了如何使用QSharedMemory類(共享內存)進行進程間通信。

??構建示例,請運行make。要運行該示例,請運行兩個實例。main()函數創建一個應用程序和我們示例的Dialog類的實例。顯示對話框,然后將控制以標準方式傳遞給應用程序。

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

??展示Dialog類的兩個實例。共享內存示例的屏幕截圖?

共享內存示例的屏幕截圖

??Dialog類繼承QDialog。它封裝了用戶界面和QSharedMemory實例。它還具有兩個公有槽函數,分別是loadFromFile()和loadFromMemory(),它們對應于對話框上的兩個按鈕。

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;
};

??構造函數將構建用戶界面小部件,并將每個按鈕的clicked()信號連接到相應的槽函數。

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()構造函數以用作鍵值。系統會將其用作基礎共享內存段的標識符。

??單擊Load Image From File...按鈕,會調用loadFromFile()槽函數。首先,它測試共享內存段是否已附加到該進程。如果是這樣,則該段將從過程中分離出來,因此可以確保我們正確地開始執行該示例。

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將圖像流式傳輸到QBuffer中。設置大小,然后我們將其用于create()我們的共享內存段。創建共享內存段會自動將該段附加到進程。在這里使用QBuffer可使我們獲得指向圖像數據的指針,然后將其用于從QBuffer到共享內存段的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();
}

??請注意,在復制到共享內存段之前,我們先對其進行lock(),然后在復制后立即再次對其進行unlock()。這樣可以確保我們擁有對共享內存段的獨占訪問權來執行我們的memcopy()。如果某個其他進程具有段鎖,則我們的進程將阻塞,直到該鎖可用為止。

??還要注意,該函數不會在memcopy()和unlock()之后從共享內存段中detach()。回想一下,當最后一個進程從共享內存段中分離時,該段將由操作系統釋放。由于此過程目前僅連接到共享內存段,因此,如果loadFromFile()從共享內存段分離,則該段將被銷毀,然后再進行下一步。

??函數返回時,如果您選擇的文件是qt.png,則第一個對話框如下所示。

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));
}

??在這種情況下,該函數會從該段執行detach(),因為現在我們已經有效地完成了對它的使用。最后,顯示QImage。此時,兩個對話框都應顯示相同的圖像。當關閉第一個對話框時,對話框析構函數調用QSharedMemory析構函數,該析構函數與共享內存段分離。由于這是要從該段分離的最后一個進程,因此操作系統現在將釋放共享內存。

關于更多

  • QtCreator軟件可以找到:

  • 或在 以下Qt安裝目錄找到:

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

  • Qt君公眾號回復『Qt示例』獲取更多內容。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。