最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

QT編寫窗口插件實現(xiàn)調(diào)用窗口的自適應(yīng)

 更新時間:2021年06月22日 10:53:40   作者:zebra_zzh  
這篇文章主要為大家詳細介紹了QT編寫窗口插件實現(xiàn)調(diào)用窗口的自適應(yīng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

最近項目中遇到插件架構(gòu),將幾個功能模塊分別寫成了dll供主程序調(diào)用。本文主要在QT下實現(xiàn)這樣一個功能:

編寫一個dll,里面包含一個QDialog對話框作為主窗口。該dll提供四個接口,它們的作用分別是

1 打開主窗口

2 關(guān)閉主窗口

3 更新插件數(shù)據(jù)(暫不討論)

4 調(diào)用插件中的函數(shù)并獲取返回值(暫不討論)

然后由主程序調(diào)用dll,并將dll中的窗口嵌入自己的對話框中,并實現(xiàn)自適應(yīng)。

效果 

編寫dll

 1  創(chuàng)建一個Qt Library工程名為test,然后再插入一個QDialog名為testwidget。

此時工程中目錄有以下文件:

2 編輯ui,利用布局讓他能夠隨著窗口大小改變自適應(yīng)。注意對象查看器里布局變化,具體方法如下:

3 編寫接口

在test.h編寫接口函數(shù)定義,在test.cpp中實現(xiàn)。

其中全局變量g_pTestWidget是為了防止重復(fù)打開或者關(guān)閉。

代碼如下:

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

至此插件部分的任務(wù)完成了。

編寫主程序

主程序為一個QWidget窗口,我們要將加載的QDialog窗口放進Widget控件里,并使他相對于Widget實現(xiàn)自適應(yīng)。因此我們需要

子類化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)
{
 /*
 發(fā)現(xiàn) 繼承自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如下:

也以同樣的布局方式設(shè)置自適應(yīng)。

下面編寫加載函數(shù),用QLibrary顯示加載dll,首先定義四個與dll中接口一致的函數(shù)指針。

代碼如下:

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

至此主程序編寫完畢。

總結(jié)

如果主程序需要集成多個插件呢?那就要設(shè)計一個插件管理工具,下次再講。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解C++之C++11的牛逼特性

    詳解C++之C++11的牛逼特性

    這篇文章主要介紹了C++之C++11的牛逼特性,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • 實例講解C語言編程中的結(jié)構(gòu)體對齊

    實例講解C語言編程中的結(jié)構(gòu)體對齊

    這篇文章主要介紹了C語言編程中的結(jié)構(gòu)體對齊,值得注意的是一些結(jié)構(gòu)體對齊的例子在不同編譯器下結(jié)果可能會不同,需要的朋友可以參考下
    2016-04-04
  • Qt利用QGraphicsView繪制跳舞的機器人

    Qt利用QGraphicsView繪制跳舞的機器人

    最近新學(xué)了一招秘密武器,打算分享給大家!那就是如何在QGraphicsView中制作一個跳舞的機器人,快跟隨小編一起動手嘗試一下吧
    2022-06-06
  • Qt編寫地圖實現(xiàn)實時動態(tài)軌跡效果

    Qt編寫地圖實現(xiàn)實時動態(tài)軌跡效果

    實時動態(tài)軌跡主要是需要在地圖上動態(tài)顯示GPS的運動軌跡,也是編寫地圖時一個重要的功能。本文將利用Qt實現(xiàn)這一功能,需要的可以參考一下
    2022-02-02
  • C語言實現(xiàn)帶頭雙向環(huán)形鏈表

    C語言實現(xiàn)帶頭雙向環(huán)形鏈表

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)帶頭雙向環(huán)形鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • VSCode配置C/C++環(huán)境的最新詳細教程

    VSCode配置C/C++環(huán)境的最新詳細教程

    VisualStudioCode(簡稱VSCode)是Microsoft開發(fā)的代碼編輯器,它支持Windows,Linux和macOS等操作系統(tǒng)以及開源代碼,下面這篇文章主要給大家介紹了關(guān)于VSCode配置C/C++環(huán)境的最新詳細教程,需要的朋友可以參考下
    2022-12-12
  • C語言實現(xiàn)簡單的定時器

    C語言實現(xiàn)簡單的定時器

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的定時器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • json error: Use of overloaded operator [] is ambiguous錯誤的解決方法

    json error: Use of overloaded operator [] is ambiguous錯誤的解決方

    今天小編就為大家分享一篇關(guān)于json error: Use of overloaded operator [] is ambiguous錯誤的解決方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C++實現(xiàn)堆排序?qū)嵗榻B

    C++實現(xiàn)堆排序?qū)嵗榻B

    大家好,本篇文章主要講的是C++實現(xiàn)堆排序?qū)嵗榻B,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C++可變參數(shù)的函數(shù)與模板實例分析

    C++可變參數(shù)的函數(shù)與模板實例分析

    這篇文章主要介紹了C++可變參數(shù)的函數(shù)與模板,非常重要的概念,需要的朋友可以參考下
    2014-08-08

最新評論

青冈县| 英德市| 葫芦岛市| 乐清市| 乐山市| 镇巴县| 盐亭县| 星子县| 涪陵区| 宜春市| 全州县| 休宁县| 双峰县| 玉屏| 彰化市| 石林| 凭祥市| 大化| 永年县| 邓州市| 肥西县| 寻乌县| 南皮县| 通州区| 阿鲁科尔沁旗| 泰兴市| 财经| 日喀则市| 双江| 海原县| 大冶市| 绥化市| 新疆| 修文县| 南召县| 合川市| 达拉特旗| 额尔古纳市| 秦安县| 榆社县| 博白县|