QT 창 플러그 인 을 작성 하여 호출 창의 적응 을 실현 합 니 다.
최근 프로젝트 에서 플러그 인 구 조 를 만 나 몇 가지 기능 모듈 을 각각 dll 로 작성 하여 주 프로그램 호출 을 제공 합 니 다.본 고 는 주로 QT 에서 이러한 기능 을 실현 한다.
주 창 으로 QDialog 대화 상 자 를 포함 하 는 dll 을 만 듭 니 다.이 dll 은 네 개의 인 터 페 이 스 를 제공 합 니 다.그들의 역할 은 각각...
1 주 창 열기
2 주 창 닫 기
3 플러그 인 데이터 업데이트(잠시 논의 하지 않 음)
4.플러그 인의 함 수 를 호출 하고 반환 값 을 가 져 옵 니 다(잠시 토론 하지 않 음)
그리고 주 프로그램 에서 dll 을 호출 하고 dll 의 창 을 자신의 대화 상자 에 끼 워 넣 고 적응 합 니 다.
효과.
dll 작성
1 Qt Library 프로젝트 이름 을 test 로 만 들 고 QDialog 이름 을 testwidget 으로 삽입 합 니 다.
이 프로젝트 의 디 렉 터 리 에 다음 파일 이 있 습 니 다.
2 ui 를 편집 하고 레이아웃 을 이용 하여 창 크기 에 따라 적응 할 수 있 도록 합 니 다.대상 뷰 어의 레이아웃 변 화 를 주의 하 십시오.구체 적 인 방법 은 다음 과 같 습 니 다.
3.인터페이스 작성
test.h 에서 인터페이스 함수 정 의 를 작성 하여 test.cpp 에서 이 루어 집 니 다.
그 중 전역 변수 gpTestWidget 은 중복 열 리 거나 닫 히 는 것 을 방지 하기 위해 서 입 니 다.
코드 는 다음 과 같 습 니 다:
#ifndef TEST_H
#define TEST_H
#include "test_global.h"
#include "testwidget.h"
class TEST_EXPORT test
{
public:
test();
~test();
private:
};
#ifdef __cplusplus
extern "C" { // we need to export the C interface
#endif
void TEST_EXPORT PluginStart(void *lParentWidget);
void TEST_EXPORT PluginClose(bool bCompleteClose);
void TEST_EXPORT PluginUpdate(void *upDate);
TEST_EXPORT const char* PluginFunction(const char* input);
#ifdef __cplusplus
}
#endif
#endif // TEST_H
#include "test.h"
testWidget *g_pTestWidget = NULL;
test::test()
{
}
test::~test()
{
}
void TEST_EXPORT PluginStart(void *lParentWidget)
{
if (NULL == g_pTestWidget)
{
g_pTestWidget = new testWidget();
}
if (NULL != lParentWidget)
{
g_pTestWidget->setParent((QDialog *)lParentWidget);
g_pTestWidget->raise();
g_pTestWidget->setGeometry(0, 0, ((QDialog *)lParentWidget)->width(), ((QDialog *)lParentWidget)->height());
}
g_pTestWidget->show();
}
void TEST_EXPORT PluginClose(bool bCompleteClose)
{
if (g_pTestWidget != NULL)
{
if (bCompleteClose)
{
g_pTestWidget->hide();
}
else
{
g_pTestWidget->close();
delete g_pTestWidget;
g_pTestWidget = NULL;
}
}
}
void TEST_EXPORT PluginUpdate(void *upDate)
{
}
TEST_EXPORT const char* PluginFunction(const char* input)
{
return input;
}
이로써 플러그 인 부분의 작업 이 완료 되 었 습 니 다.주 프로그램 작성
주 프로그램 은 QWidget 창 입 니 다.불 러 온 QDialog 창 을 Widget 컨트롤 에 넣 고 Widget 에 적응 하도록 해 야 합 니 다.그래서 우 리 는 필요 하 다.
하위 클래스 화 Widget 컨트롤(QWidget),그의 resizeEvent 를 다시 씁 니 다.
QResizingWidget 은 QWidget 에서 계승 합 니 다:
#ifndef QRESIZINGWIDGET_H
#define QRESIZINGWIDGET_H
#pragma once
#include <QWidget>
class QResizingWidget : public QWidget
{
Q_OBJECT
public:
explicit QResizingWidget(QWidget *parent = 0);
virtual ~QResizingWidget();
protected:
virtual void paintEvent(QPaintEvent *sEvent);
virtual void resizeEvent(QResizeEvent* sEvent);
};
#endif
#include "qresizingwidget.h"
#include <QResizeEvent>
#include <QStyleOption>
#include <QPainter>
QResizingWidget::QResizingWidget(QWidget *parent /*= 0*/)
: QWidget(parent)
{
}
QResizingWidget::~QResizingWidget()
{
}
void QResizingWidget::resizeEvent(QResizeEvent* sEvent)
{
QWidget::resizeEvent(sEvent);
foreach(auto itr, children())
{
if (itr->isWidgetType())
{
itr->setProperty("geometry", QRectF(0, 0, geometry().width(), geometry().height()));
}
}
}
void QResizingWidget::paintEvent(QPaintEvent *sEvent)
{
/*
QWidget , setStyleSheet ,
Q_OBJECT,setStyleSheet ,
OBJECT signal and slot,
, QWidget , paintEvent ,
:
*/
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
QWidget::paintEvent(sEvent);
}
주 프로그램 QWidget 은 다음 과 같 습 니 다.같은 레이아웃 으로 적응 을 설정 합 니 다.
다음은 불 러 오 는 함 수 를 작성 합 니 다.dll 을 불 러 오 는 것 을 QLibrary 로 표시 합 니 다.먼저 dll 인터페이스 와 일치 하 는 함수 포인터 네 개 를 정의 합 니 다.
코드 는 다음 과 같 습 니 다:
#include "testdll.h"
#include <QLibrary>
#include <QDebug>
typedef void (*fun_start)(void *lparentWidget);
typedef void (*fun_close)(bool bCompleteClose);
typedef void (*fun_update)(const char *upDate);
typedef const char* (*fun_callback)(void *input);
fun_start g_Start = NULL;
fun_close g_End = NULL;
QLibrary myDll;
testDll::testDll(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
connect(ui.load, SIGNAL(clicked()), this, SLOT(load()));
connect(ui.unload, SIGNAL(clicked()), this, SLOT(unload()));
}
testDll::~testDll()
{
}
void testDll::load()
{
myDll.setFileName("test.dll");
if (myDll.load())
{
if (!myDll.isLoaded())
{
qDebug() << "load error!";
}
else
{
g_Start = (fun_start)myDll.resolve("PluginStart");
qDebug() << g_Start;
qDebug() << "load success!";
g_Start(ui.widget);
}
}
}
void testDll::unload()
{
if (myDll.isLoaded())
{
g_End = (fun_close)myDll.resolve("PluginClose");
g_End(false);
myDll.unload();
}
}
이로써 메 인 프로그램 작성 이 완료 되 었 습 니 다.총결산
만약 메 인 프로그램 이 여러 개의 플러그 인 을 통합 해 야 한다 면?그럼 플러그 인 관리 도 구 를 설계 해 야 합 니 다.다음 에 말씀 드 리 겠 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
간편한 채팅 시스템 - 메시지 전달 서버메시지 전송 서버는 메시지 대기열에서 온 데이터를 받아들여 디코딩, 식별 등을 하고 마지막으로 분류를 나눈다.예를 들어 채팅 시스템은 같은 그룹과 같은 세션의 정보를 같은 그룹 서비스로 전송한다(물론 아직 같은 그룹...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.