mirror of
https://github.com/crystalidea/qt6windows7.git
synced 2025-07-05 16:55:25 +08:00
qt 6.5.1 original
This commit is contained in:
37
examples/corelib/ipc/sharedmemory/CMakeLists.txt
Normal file
37
examples/corelib/ipc/sharedmemory/CMakeLists.txt
Normal file
@ -0,0 +1,37 @@
|
||||
# Copyright (C) 2022 The Qt Company Ltd.
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(sharedmemory LANGUAGES CXX)
|
||||
|
||||
if(NOT DEFINED INSTALL_EXAMPLESDIR)
|
||||
set(INSTALL_EXAMPLESDIR "examples")
|
||||
endif()
|
||||
|
||||
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/corelib/ipc/sharedmemory")
|
||||
|
||||
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
|
||||
|
||||
qt_standard_project_setup()
|
||||
|
||||
qt_add_executable(sharedmemory
|
||||
dialog.cpp dialog.h dialog.ui
|
||||
main.cpp
|
||||
)
|
||||
|
||||
set_target_properties(sharedmemory PROPERTIES
|
||||
WIN32_EXECUTABLE TRUE
|
||||
MACOSX_BUNDLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(sharedmemory PRIVATE
|
||||
Qt6::Core
|
||||
Qt6::Gui
|
||||
Qt6::Widgets
|
||||
)
|
||||
|
||||
install(TARGETS sharedmemory
|
||||
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
)
|
155
examples/corelib/ipc/sharedmemory/dialog.cpp
Normal file
155
examples/corelib/ipc/sharedmemory/dialog.cpp
Normal file
@ -0,0 +1,155 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include "dialog.h"
|
||||
#include <QFileDialog>
|
||||
#include <QBuffer>
|
||||
|
||||
/*!
|
||||
\class Dialog
|
||||
|
||||
\brief This class is a simple example of how to use QSharedMemory.
|
||||
|
||||
It is a simple dialog that presents a few buttons. To compile the
|
||||
example, run make in qt/examples/ipc. Then run the executable twice
|
||||
to create two processes running the dialog. In one of the processes,
|
||||
press the button to load an image into a shared memory segment, and
|
||||
then select an image file to load. Once the first process has loaded
|
||||
and displayed the image, in the second process, press the button to
|
||||
read the same image from shared memory. The second process displays
|
||||
the same image loaded from its new loaction in shared memory.
|
||||
*/
|
||||
|
||||
/*!
|
||||
The class contains a data member \l {QSharedMemory} {sharedMemory},
|
||||
which is initialized with the key "QSharedMemoryExample" to force
|
||||
all instances of Dialog to access the same shared memory segment.
|
||||
The constructor also connects the clicked() signal from each of the
|
||||
three dialog buttons to the slot function appropriate for handling
|
||||
each button.
|
||||
*/
|
||||
//! [0]
|
||||
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"));
|
||||
}
|
||||
//! [0]
|
||||
|
||||
/*!
|
||||
This slot function is called when the \tt {Load Image From File...}
|
||||
button is pressed on the firs Dialog process. First, it tests
|
||||
whether the process is already connected to a shared memory segment
|
||||
and, if so, detaches from that segment. This ensures that we always
|
||||
start the example from the beginning if we run it multiple times
|
||||
with the same two Dialog processes. After detaching from an existing
|
||||
shared memory segment, the user is prompted to select an image file.
|
||||
The selected file is loaded into a QImage. The QImage is displayed
|
||||
in the Dialog and streamed into a QBuffer with a QDataStream.
|
||||
|
||||
Next, it gets a new shared memory segment from the system big enough
|
||||
to hold the image data in the QBuffer, and it locks the segment to
|
||||
prevent the second Dialog process from accessing it. Then it copies
|
||||
the image from the QBuffer into the shared memory segment. Finally,
|
||||
it unlocks the shared memory segment so the second Dialog process
|
||||
can access it.
|
||||
|
||||
After this function runs, the user is expected to press the \tt
|
||||
{Load Image from Shared Memory} button on the second Dialog process.
|
||||
|
||||
\sa loadFromMemory()
|
||||
*/
|
||||
//! [1]
|
||||
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));
|
||||
//! [1] //! [2]
|
||||
|
||||
// load into shared memory
|
||||
QBuffer buffer;
|
||||
buffer.open(QBuffer::ReadWrite);
|
||||
QDataStream out(&buffer);
|
||||
out << image;
|
||||
int size = buffer.size();
|
||||
|
||||
if (!sharedMemory.create(size)) {
|
||||
if (sharedMemory.error() == QSharedMemory::AlreadyExists) {
|
||||
sharedMemory.attach();
|
||||
} else {
|
||||
ui.label->setText(tr("Unable to create or attach to shared memory segment: %1")
|
||||
.arg(sharedMemory.errorString()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
sharedMemory.lock();
|
||||
char *to = (char*)sharedMemory.data();
|
||||
const char *from = buffer.data().data();
|
||||
memcpy(to, from, qMin(sharedMemory.size(), size));
|
||||
sharedMemory.unlock();
|
||||
}
|
||||
//! [2]
|
||||
|
||||
/*!
|
||||
This slot function is called in the second Dialog process, when the
|
||||
user presses the \tt {Load Image from Shared Memory} button. First,
|
||||
it attaches the process to the shared memory segment created by the
|
||||
first Dialog process. Then it locks the segment for exclusive
|
||||
access, copies the image data from the segment into a QBuffer, and
|
||||
streams the QBuffer into a QImage. Then it unlocks the shared memory
|
||||
segment, detaches from it, and finally displays the QImage in the
|
||||
Dialog.
|
||||
|
||||
\sa loadFromFile()
|
||||
*/
|
||||
//! [3]
|
||||
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));
|
||||
}
|
||||
//! [3]
|
||||
|
||||
/*!
|
||||
This private function is called by the destructor to detach the
|
||||
process from its shared memory segment. When the last process
|
||||
detaches from a shared memory segment, the system releases the
|
||||
shared memory.
|
||||
*/
|
||||
void Dialog::detach()
|
||||
{
|
||||
if (!sharedMemory.detach())
|
||||
ui.label->setText(tr("Unable to detach from shared memory."));
|
||||
}
|
||||
|
33
examples/corelib/ipc/sharedmemory/dialog.h
Normal file
33
examples/corelib/ipc/sharedmemory/dialog.h
Normal file
@ -0,0 +1,33 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#ifndef DIALOG_H
|
||||
#define DIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QSharedMemory>
|
||||
#include "ui_dialog.h"
|
||||
|
||||
//! [0]
|
||||
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;
|
||||
};
|
||||
//! [0]
|
||||
|
||||
#endif
|
||||
|
47
examples/corelib/ipc/sharedmemory/dialog.ui
Normal file
47
examples/corelib/ipc/sharedmemory/dialog.ui
Normal file
@ -0,0 +1,47 @@
|
||||
<ui version="4.0" >
|
||||
<class>Dialog</class>
|
||||
<widget class="QDialog" name="Dialog" >
|
||||
<property name="geometry" >
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>451</width>
|
||||
<height>322</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle" >
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" >
|
||||
<item row="0" column="0" >
|
||||
<widget class="QPushButton" name="loadFromFileButton" >
|
||||
<property name="text" >
|
||||
<string>Load Image From File...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" >
|
||||
<widget class="QLabel" name="label" >
|
||||
<property name="text" >
|
||||
<string>Launch two of these dialogs. In the first, press the top button and load an image from a file. In the second, press the bottom button and display the loaded image from shared memory.</string>
|
||||
</property>
|
||||
<property name="alignment" >
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="wordWrap" >
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" >
|
||||
<widget class="QPushButton" name="loadFromSharedMemoryButton" >
|
||||
<property name="text" >
|
||||
<string>Display Image From Shared Memory</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
BIN
examples/corelib/ipc/sharedmemory/image.png
Normal file
BIN
examples/corelib/ipc/sharedmemory/image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
16
examples/corelib/ipc/sharedmemory/main.cpp
Normal file
16
examples/corelib/ipc/sharedmemory/main.cpp
Normal file
@ -0,0 +1,16 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include <QApplication>
|
||||
#include "dialog.h"
|
||||
|
||||
//! [0]
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication application(argc, argv);
|
||||
Dialog dialog;
|
||||
dialog.show();
|
||||
return application.exec();
|
||||
}
|
||||
//! [0]
|
||||
|
BIN
examples/corelib/ipc/sharedmemory/qt.png
Normal file
BIN
examples/corelib/ipc/sharedmemory/qt.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.9 KiB |
16
examples/corelib/ipc/sharedmemory/sharedmemory.pro
Normal file
16
examples/corelib/ipc/sharedmemory/sharedmemory.pro
Normal file
@ -0,0 +1,16 @@
|
||||
QT += widgets
|
||||
requires(qtConfig(filedialog))
|
||||
|
||||
SOURCES += main.cpp \
|
||||
dialog.cpp
|
||||
|
||||
HEADERS += dialog.h
|
||||
|
||||
# Forms and resources
|
||||
FORMS += dialog.ui
|
||||
|
||||
EXAMPLE_FILES = *.png
|
||||
|
||||
# install
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/corelib/ipc/sharedmemory
|
||||
INSTALLS += target
|
Reference in New Issue
Block a user