PIMPL代表P ointer到IMPL ementation.实现代表"实现细节":类的用户不必关心的东西.
Qt自己的类实现通过使用PIMPL惯用法将接口与实现完全分开.然而,Qt提供的机制没有记录.怎么用?
我想这是关于Qt中"我如何进行PIMPL"的规范性问题.答案将由下面显示的简单坐标输入对话框界面激发.
当我们有任何半复杂的实现时,使用PIMPL的动机就变得明显了.这个问题给出了进一步的动机.即使是一个相当简单的类也必须在其界面中引入许多其他头文件.

基于PIMPL的接口非常干净且易读.
// CoordinateDialog.h
#include <QDialog>
#include <QVector3D>
class CoordinateDialogPrivate;
class CoordinateDialog : public QDialog
{
Q_OBJECT
Q_DECLARE_PRIVATE(CoordinateDialog)
#if QT_VERSION <= QT_VERSION_CHECK(5,0,0)
Q_PRIVATE_SLOT(d_func(), void onAccepted())
#endif
QScopedPointer<CoordinateDialogPrivate> const d_ptr;
public:
CoordinateDialog(QWidget * parent = 0, Qt::WindowFlags flags = 0);
~CoordinateDialog();
QVector3D coordinates() const;
Q_SIGNAL void acceptedCoordinates(const QVector3D &);
};
Q_DECLARE_METATYPE(QVector3D)
Run Code Online (Sandbox Code Playgroud)
基于Qt 5,C++ 11的接口不需要该Q_PRIVATE_SLOT行.
将其与非PIMPL接口进行比较,该接口将实现细节隐藏在接口的私有部分中.请注意必须包含多少其他代码.
// CoordinateDialog.h
#include <QDialog>
#include <QVector3D>
#include <QFormLayout>
#include <QDoubleSpinBox>
#include <QDialogButtonBox>
class CoordinateDialog : …Run Code Online (Sandbox Code Playgroud) 我一直在互联网上搜索有关这方面的一些有用且清晰的信息,令人讨厌的是,这样一件微不足道的事情很难做到.
我需要的是为我的Qt项目创建一个可执行文件,以便在其他计算机上运行它.我的项目在Qt Creator中运行得很好,但是当我尝试运行在release文件夹中创建的可执行文件时,我得到了一些dll丢失的错误,虽然我已将它们全部放在我的.exe的同一目录中但我现在得到了一些关于dll(QtCore4.dll)中的程序中的入口点的错误.
该解决方案看起来像是一个静态链接,我发现了很多关于它的信息,但它们都没有真正帮助我.这是我到目前为止所尝试的:
为此,我找不到任何解决方案,所以我在这里,只是尝试为我的Qt项目创建一个可执行文件,希望你们能在这里给我一些启示.
我知道这可能是一个类似于其他许多问题的问题,但经过多次搜索并且未能获得明确有效的解决方案后,我不得不提出这个问题.
我正在使用Qt 5.2.0 for Windows 32位(VS 2010,570 MB),我已经完成了我的编程,而且一切都完成了.但是现在我想将它作为.exe文件分发给我的同事,但是这样做没有复杂性并且为了避免分发dll文件我需要使用静态链接来构建程序.
您能否描述一下我如何使用静态链接构建整个程序的Qt 5.2.0 for Windows 32-bit(VS 2010,570 MB)?
谢谢.
我在Linux环境中使用基于Qt 5.0.1的Qt Creator 2.6.2.应用程序在我编译的计算机上工作正常,但是当我在另一台计算机上执行它时,我得到的错误如下:
error while loading shared libraries: libQt5WebKitWidgets.so.5: cannot open shared object file: No such file or directory
error while loading shared libraries: libxslt.so.1: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我在这个链接中找到了一些解决方案(一些链接已经死了).
所以我在我的.pro文件中添加了这一行:
CONFIG += static
Run Code Online (Sandbox Code Playgroud)
静态编译我的项目.
我以为我得到的文件会更大,但我有相同的大小和相同的错误.
谢谢.
我用Qt5.3.1编写了一个程序,并在我的开发机器上运行它可以正常工作.我将所有必需的.dll文件复制到我的.exe所在的文件夹中.这些是:
现在我想在没有安装Qt的机器上运行该程序.我怎么做?用户不必为了使用程序而安装IDE,对吗?
开发机器的工作原理:
部署平台是:
我得到的错误是第一个:
此应用程序无法启动,因为它无法找到或加载Qt平台插件"windows".重新安装应用程序可能会解决此问题.
下一条错误消息是:
此应用程序请求运行时以不寻常的方式终止.请联系支持.
然后程序崩溃了. 但是如果我安装Qt5.3.1就可以了.所以它是与文件的c:/Qt目录
我正在使用Ubuntu 10.04和Qt4.6,并且我已经通过QtCreator在我自己的计算机上创建了一个可执行的二进制文件.
现在我想将我的可执行文件放在CentOS 5上,但似乎这个可执行文件无法在CentOS上运行.
错误消息是
bash: ./[filename]: cannot execute binary file
Run Code Online (Sandbox Code Playgroud)
现在我知道这来自32位和64位问题,并成功创建了32位可执行文件.
但是,由于动态链接问题,这个可执行文件仍然无法在CentOS上运行,它总是显示:
Error while loading shared libraries: libQtGUI.so.4: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我试图在.pro文件中添加"-static"标志
QMAKE_CFLAGS_RELEASE += -Os -static
QMAKE_CPPFLAGS_RELEASE += -Os -static
QMAKE_CXXFLAGS_RELEASE += -Os -static
QMAKE_CCFLAGS_RELEASE += -Os -static
Run Code Online (Sandbox Code Playgroud)
然而,看起来它只生成"静态二进制"而不是"静态链接",依赖性仍然存在.
我还尝试在.pro文件中添加以下行:
QMAKE_LFLAGS += static
Run Code Online (Sandbox Code Playgroud)
但是这个项目在执行此操作后无法编译.我没有权限在Cent OS上安装Qt,如何用静态链接编译这个项目,以便可执行文件可以独立运行?
谢谢你的帮助!
是否有任何方法可以在Visual Studio中以相同的快速简便方式构建图形界面,但没有.NET Framework?我正在寻找本机Windows GUI,因此使用Qt与Qt Creator不是一个选项(并且它不需要是跨平台的).使用C++的Windows API的东西会很棒(不是Delphi).
我的意思是,像WinSCP这样的应用程序真的有完全手工编写的GUI吗?
我开始和Qt一起回来了.我已经下载了Windows 32位版本(666mB),没有别的.我做了一个简单的计算器应用程序.当我从Qt创建者运行它时,应用程序运行,但内置的exe显示dll丢失.我不想使用依赖walker.我想创建一个静态构建(我读过它,但我无法让它运行)
我的目标是制作一个功能齐全的计算器(无安装程序),而无需手动添加依赖项.我已经阅读了有关configure -static的内容,但我不明白如何使用它.在此先感谢您的帮助.
我想将 Qt 库静态链接到我的程序,以便它可以在我学校的计算机上运行。我们没有打算在这些计算机上安装任何东西,因此静态链接是我唯一的机会。
到目前为止,这是我的 cmake 文件
cmake_minimum_required(VERSION 3.9)
project(Calculator)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wpedantic -Wextra -std=gnu++14 -no-pie -fPIC -static -lQt5Widgets -lQt5Gui -lQt5Core")
find_package(Qt5Widgets REQUIRED)
include_directories(/usr/include/qt/QtWidgets /usr/include/qt /usr/include/qt/QtGui /usr/include/qt /usr/include/qt/QtCore /usr/include/qt)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
add_executable(${PROJECT_NAME} main.cpp calculator.cpp resources.qrc calculatestring.cpp )
Run Code Online (Sandbox Code Playgroud)
这是我尝试运行此 cmake 文件时得到的结果:-
/bin/ld: cannot find -lQt5Widgets
/bin/ld: cannot find -lQt5Gui
/bin/ld: cannot find -lQt5Core
Run Code Online (Sandbox Code Playgroud)
如果我删除-static标志,它编译得很好,但只能在安装了 qt 的机器上运行。
当我尝试在没有安装 qt 的 Arch Linux 的 VirtualMachine 上运行它时,它给了我错误:-
error while loading shared libraries : libQt5Widgets.so.5: …Run Code Online (Sandbox Code Playgroud) c++ ×9
qt ×8
windows ×3
qt-creator ×2
qt5 ×2
deployment ×1
gcc ×1
linux ×1
native ×1
pimpl-idiom ×1
qt4 ×1
static ×1