QT调用VNC并放到一个窗口中

1.VNC资源下载

本例中的这个VNC可以从以下连接中下载,也可以从官网上下载,应该都是类似的。

https://download.youkuaiyun.com/download/xiaoding_ding/89549092

下载完成后放到项目的release文件夹中

2.程序中引用

2.1在主界面中放置一个按钮,命名为vnc_connect

2.2 通过按钮转到槽,修改mainwindow.cpp

里面的内容如下: 

    QProcess program(this);
    QString cmd ="VNC-Viewer-7.6.1-Windows-64bit.exe";
    program.startDetached(cmd);

    Sleep(200);
    QString classname = "os::Window::Dialog";//窗口的类名
    QString windowname = "RealVNC Viewer";//窗口标题名
    WId winId = (WId)FindWindow((LPCWSTR)classname.unicode(),(LPCWSTR)windowname.unicode());
    qDebug()<<winId;
    QWindow *window = QWindow::fromWinId(winId);

    QWidget *widget = QWidget::createWindowContainer(window);
    widget->show();

 2.3增加头文件

增加图示中的四个

3.运行效果

点击按钮就是这种效果

 4.问题说明

将这个窗口关闭后,再次点击“打开VNC”按钮后,会显示空白

这是因为程序中的process是独立执行的。关闭这个窗口,VNC进程还在。

在任务管理中杀死这个进程后,就可以重新调用了。

5.窗口句柄的获得

5.1打开visual studio,点击搜索,搜索功能spy

5.2打开vnc和spy,从搜索中拖动那个2中的标靶到VNC标题栏中。

 5.3在程序中进行对应

 6.总结

中间总是有各种各样的问题,本例提供了一种探索。中间有问题还是可以多搜索一下相关文章。

堆栈是HiViewer!QtPrivate::FunctorCall<QtPrivate::IndexesList<0,1,2,3>,QtPrivate::List<int,MVSPropertyTreeItem * __ptr64,int,bool>,void,void (__cdecl MVSFeatureTreeView::*)(int,MVSPropertyTreeItem * __ptr64,int,bool) __ptr64>::call+0x81 [f:\application\qt\qt5_6_64\5.6.3\msvc2013_64\include\qtcore\qobjectdefs_impl.h @ 501] HiViewer!QtPrivate::FunctionPointer<void (__cdecl MVSFeatureTreeView::*)(int,MVSPropertyTreeItem * __ptr64,int,bool) __ptr64>::call<QtPrivate::List<int,MVSPropertyTreeItem * __ptr64,int,bool>,void>+0x3d [f:\application\qt\qt5_6_64\5.6.3\msvc2013_64\include\qtcore\qobjectdefs_impl.h @ 521] HiViewer!QtPrivate::QSlotObject<void (__cdecl MVSFeatureTreeView::*)(int,MVSPropertyTreeItem * __ptr64,int,bool) __ptr64,QtPrivate::List<int,MVSPropertyTreeItem * __ptr64,int,bool>,void>::impl+0xb6 [f:\application\qt\qt5_6_64\5.6.3\msvc2013_64\include\qtcore\qobject_impl.h @ 144] Qt5Core!QMetaCallEvent::placeMetaCall+0x34 Qt5Core!QObject::event+0xda Qt5Widgets!QWidget::event+0xebc Qt5Widgets!QFrame::event+0x37 Qt5Widgets!QAbstractScrollArea::event+0x4d3 Qt5Widgets!QApplicationPrivate::notify_helper+0x112 Qt5Widgets!QApplication::notify+0x1b3f Qt5Core!QCoreApplication::notifyInternal2+0xb9 Qt5Core!QCoreApplicationPrivate::sendPostedEvents+0x21e qwindows!qt_plugin_query_metadata+0x24bf Qt5Core!QEventDispatcherWin32::processEvents+0xe05 user32!CallWindowProcW+0x3f8 user32!DispatchMessageW+0x259 Qt5Core!QEventDispatcherWin32::processEvents+0x576 qwindows!qt_plugin_query_metadata+0x2499 Qt5Core!QCoreApplication::processEvents+0x22 HiViewer!QMvsCentralWindow::OnFeatureTreeValueCha
08-21
<think> 我们正在处理一个关于Qt VNC中中文字体不显示的问题。根据用户的问题,我们需要提供解决方案。 首先,我们需要分析问题可能的原因。VNC(Virtual Network Computing)是一种图形桌面共享系统,Qt VNC可能指的是基于Qt框架实现的VNC客户端或服务器。中文字体不显示通常是因为字体缺失或编码问题。 可能的原因: 1. 系统缺少中文字体。 2. 应用程序没有正确设置字体或字体路径。 3. VNC传输中可能没有正确处理字体的渲染。 解决方案步骤: 1. 确保系统安装了中文字体包。例如,在Ubuntu/Debian系统中,可以安装`fonts-wqy-microhei`或`fonts-wqy-zenhei`等中文字体。 2. 在Qt应用程序中,设置默认字体为中文字体。可以在代码中设置全局字体,例如: ```cpp QFont font("WenQuanYi Micro Hei"); // 或者使用其他中文字体名称 QApplication::setFont(font); ``` 3. 检查VNC服务器的配置,确保支持中文字符集。 4. 如果使用tightvncserver等,可以尝试在启动时设置语言环境(locale)为支持中文的环境(如zh_CN.UTF-8)。 另外,如果是嵌入式环境,可能需要将中文字体文件打包到应用程序中,在运行时加载。 由于问题可能涉及多个层面,我们需要逐步排查。 注意:由于我们无法得知用户的具体环境(如操作系统、Qt版本、VNC服务器类型等),因此提供通用解决方案。 下面我们将按照上述思路给出详细解答。 </think> ### Qt VNC 中文字体不显示问题解决方案 在 Qt VNC 环境中遇到中文字体不显示的问题,通常由以下原因导致: 1. **字体缺失**:VNC 服务器或客户端未安装中文字体包 2. **编码配置错误**:字符编码设置不支持中文 3. **Qt 应用程序配置问题**:未正确加载中文字体 4. **环境变量缺失**:缺少中文语言环境配置 #### 解决方案步骤: 1. **安装中文字体包** ```bash # Debian/Ubuntu sudo apt-get install fonts-wqy-microhei fonts-wqy-zenhei # CentOS/RHEL sudo yum install wqy-microhei-fonts wqy-zenhei-fonts ``` 安装后重启 VNC 服务使字体生效[^1]。 2. **配置 Qt 应用程序字体** 在 Qt 应用程序入口添加字体加载代码: ```cpp #include <QFontDatabase> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 加载中文字体 int fontId = QFontDatabase::addApplicationFont("/usr/share/fonts/wenquanyi/wqy-microhei.ttc"); if(fontId != -1) { QStringList fontFamilies = QFontDatabase::applicationFontFamilies(fontId); if(!fontFamilies.empty()) { QFont font(fontFamilies.at(0)); app.setFont(font); } } // ...后续代码 } ``` 3. **设置 VNC 语言环境** 修改 VNC 启动配置(通常位于 `~/.vnc/xstartup`): ```bash export LANG=zh_CN.UTF-8 export LANGUAGE=zh_CN:zh export LC_ALL=zh_CN.UTF-8 ``` 4. **检查 Qt 渲染设置** 确保启用字体抗锯齿和子像素渲染: ```cpp QFont font; font.setStyleStrategy(QFont::PreferAntialias); font.setHintingPreference(QFont::PreferFullHinting); ``` 5. **验证字体路径** 在 Qt 应用程序中检查可用字体: ```cpp qDebug() << "Available fonts:" << QFontDatabase::families(); ``` #### 测试验证 创建测试界面验证中文显示: ```cpp QLabel *testLabel = new QLabel(QObject::tr("中文测试:你好世界!")); testLabel->setFont(QFont("WenQuanYi Micro Hei", 12)); testLabel->show(); ``` > **注意**:如果使用嵌入式设备,需确保字体文件已打包到文件系统中。可通过 `ldd` 检查 Qt 是否链接了字体库(如 libfontconfig)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leecheni

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值