我的编程空间,编程开发者的网络收藏夹
学习永远不晚

QT编写窗口插件实现调用窗口的自适应

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

QT编写窗口插件实现调用窗口的自适应

前言

最近项目中遇到插件架构,将几个功能模块分别写成了dll供主程序调用。本文主要在QT下实现这样一个功能:

编写一个dll,里面包含一个QDialog对话框作为主窗口。该dll提供四个接口,它们的作用分别是

1 打开主窗口

2 关闭主窗口

3 更新插件数据(暂不讨论)

4 调用插件中的函数并获取返回值(暂不讨论)

然后由主程序调用dll,并将dll中的窗口嵌入自己的对话框中,并实现自适应。

效果 

编写dll

 1  创建一个Qt Library工程名为test,然后再插入一个QDialog名为testwidget。

此时工程中目录有以下文件:

2 编辑ui,利用布局让他能够随着窗口大小改变自适应。注意对象查看器里布局变化,具体方法如下:

3 编写接口

在test.h编写接口函数定义,在test.cpp中实现。

其中全局变量g_pTestWidget是为了防止重复打开或者关闭。

代码如下:


#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 )
    : 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)
{
 
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
 QWidget::paintEvent(sEvent);
}

主程序QWidget如下:

也以同样的布局方式设置自适应。

下面编写加载函数,用QLibrary显示加载dll,首先定义四个与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();
 }
}

至此主程序编写完毕。

总结

如果主程序需要集成多个插件呢?那就要设计一个插件管理工具,下次再讲。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

QT编写窗口插件实现调用窗口的自适应

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

winform控件随窗口自适应怎么实现

在WinForm中,实现控件随窗口自适应有多种方法,下面列举两种常用的方法:方法一:使用Anchor属性1. 在设计器中选中要自适应的控件。2. 在属性窗口中找到Anchor属性,点击下拉框选择需要自适应的方向(上、下、左、右)。3. 重复
2023-10-10

iframe窗口高度自适应的实现方法

要实现iframe窗口高度自适应,可以通过以下方法:1. 使用JavaScript动态调整iframe的高度:- 在iframe加载完成后,通过获取iframe的内容高度并设置给iframe的高度。可以使用JavaScript中的`cont
2023-08-11

Android开发5:应用程序窗口小部件App Widgets的实现(附demo)

前言本次主要是实现一个Android应用,实现静态广播、动态广播两种改变 widget内容的方法,即在上篇博文中实验的基础上进行修改,所以此次实验的重点是AppWidget小部件的实现啦~ 首先,我们简单说一下Widget是一个啥玩意~ 应
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录