• 大漠插件(二、Qt使用插件时注意事项)


    本章目的

            在上篇已经注册完毕大漠,那么怎么使用大漠来制作脚本,我选择了我最熟悉的Qt来开发,毕竟只是小软件,用脚本或者c++都差不了多少。本章就是开发途中的一些坑。

            本人开发环境是 win11 64、Qt 5.15.2安装了5.10.0的msvc2015 32开发套件、vs2022安装了v143开发套件。

    开发的坑

    一 、使用32位开发套件

    64位是不行的,必须使用32位开发套件 。否则会报错失败。我的32位环境就是上面的那些。

    二、Qt使用ActiveX时的设置

    在工程的pro文件中的 QT+=  后面加上 axcontainer,否则会报错“找不到 qaxobject.h” 

    三、生成dm的头文件和cpp文件 

    在Qt路径下,根据你的开发套件版本找 dumpcpp.exe。我装的是 5.10.0 的 msvc2015 32。所以我的路径是“C:\all\Qt\5.10.0\msvc2015\bin”。

    在 dumpcpp.exe 目录下运行 cmd 。

    dumpcpp.exe C:\all\freeDM3.1233\dm.dll

    将路径换成你的dm.dll 路径。运行此命令后,在 dumpcpp.exe 目录下会生成 dm.h、dm.cpp 两个文件。我们开发时就需要使用这两个文件。

    四、C3615 constexpr 函数“qCountLeadingZeroBits”不能生成常量表达式

    我们需要修改 qalgorithms.h 。 此处参考了别人的文章

    因为我用的是 Qt 的msvc2015 开发套件,所以我的路径是 “C:\all\Qt\5.10.0\msvc2015\include\QtCore ”。在这里找到 qalgorithms.h。

    加入两行代码,修改四处即可。

    1. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint16 v) Q_DECL_NOTHROW
    2. {
    3. return __builtin_popcount(v);
    4. }
    5. #define QALGORITHMS_USE_BUILTIN_POPCOUNTLL
    6. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NOTHROW
    7. {
    8. return __builtin_popcountll(v);
    9. }
    10. #elif defined(Q_CC_MSVC) && !defined(Q_OS_WINCE) && !defined(Q_PROCESSOR_ARM)
    11. #define QT_POPCOUNT_CONSTEXPR
    12. #define QT_POPCOUNT_RELAXED_CONSTEXPR //增加的
    13. #define QT_HAS_BUILTIN_CTZ
    14. Q_ALWAYS_INLINE unsigned long qt_builtin_ctz(quint32 val)
    15. {
    16. unsigned long result;
    17. _BitScanForward(&result, val);
    18. return result;
    19. }
    20. #define QT_HAS_BUILTIN_CLZ
    21. Q_ALWAYS_INLINE unsigned long qt_builtin_clz(quint32 val)
    22. {
    23. unsigned long result;
    24. _BitScanReverse(&result, val);
    1. #if Q_PROCESSOR_WORDSIZE == 8
    2. #define QALGORITHMS_USE_BUILTIN_POPCOUNTLL
    3. Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NOTHROW
    4. {
    5. return __popcnt64(v);
    6. }
    7. #endif // MSVC 64bit
    8. #endif // __AVX__ || __SSE4_2__ || __POPCNT__
    9. #endif // MSVC
    10. #endif // QT_HAS_CONSTEXPR_BUILTINS
    11. #ifndef QT_POPCOUNT_CONSTEXPR
    12. #define QT_POPCOUNT_CONSTEXPR Q_DECL_CONSTEXPR
    13. #define QT_POPCOUNT_RELAXED_CONSTEXPR Q_DECL_RELAXED_CONSTEXPR //增加的
    14. #endif
    15. } //namespace QAlgorithmsPrivate
    16. Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint32 v) Q_DECL_NOTHROW
    17. {
    18. #ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT
    19. return QAlgorithmsPrivate::qt_builtin_popcount(v);
    20. #else
    21. // See http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
    22. return
    23. (((v ) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
    1. Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint64 v) Q_DECL_NOTHROW
    2. {
    3. #if defined(QT_HAS_BUILTIN_CTZLL)
    4. return v ? QAlgorithmsPrivate::qt_builtin_ctzll(v) : 64;
    5. #else
    6. quint32 x = static_cast(v);
    7. return x ? qCountTrailingZeroBits(x)
    8. : 32 + qCountTrailingZeroBits(static_cast(v >> 32));
    9. #endif
    10. }
    11. Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(unsigned long v) Q_DECL_NOTHROW
    12. {
    13. return qCountTrailingZeroBits(QIntegerForSizeof<long>::Unsigned(v));
    14. }
    15. Q_DECL_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint32 v) Q_DECL_NOTHROW
    16. {
    17. #if defined(QT_HAS_BUILTIN_CLZ)
    18. return v ? QAlgorithmsPrivate::qt_builtin_clz(v) : 32U;
    19. #else
    20. // Hacker's Delight, 2nd ed. Fig 5-16, p. 102
    21. v = v | (v >> 1);
    22. v = v | (v >> 2);
    23. v = v | (v >> 4);
    24. v = v | (v >> 8);
    25. v = v | (v >> 16);
    26. return qPopulationCount(~v);
    27. #endif
    28. }
    29. //改为 QT_POPCOUNT_RELAXED_CONSTEXPR
    30. QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint8 v) Q_DECL_NOTHROW
    31. {
    32. #if defined(QT_HAS_BUILTIN_CLZ)
    33. return v ? QAlgorithmsPrivate::qt_builtin_clz(v)-24U : 8U;
    34. #else
    35. v = v | (v >> 1);
    36. v = v | (v >> 2);
    37. v = v | (v >> 4);
    38. return qPopulationCount(static_cast(~v));
    39. #endif
    40. }
    41. //改为 QT_POPCOUNT_RELAXED_CONSTEXPR
    42. QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint16 v) Q_DECL_NOTHROW
    43. {
    44. #if defined(QT_HAS_BUILTIN_CLZS)
    45. return v ? QAlgorithmsPrivate::qt_builtin_clzs(v) : 16U;
    46. #else
    47. v = v | (v >> 1);
    48. v = v | (v >> 2);
    49. v = v | (v >> 4);
    50. v = v | (v >> 8);
    51. return qPopulationCount(static_cast(~v));
    52. #endif
    53. }
    54. //改为 QT_POPCOUNT_RELAXED_CONSTEXPR
    55. QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint64 v) Q_DECL_NOTHROW
    56. {
    57. #if defined(QT_HAS_BUILTIN_CLZLL)
    58. return v ? QAlgorithmsPrivate::qt_builtin_clzll(v) : 64U;
    59. #else
    60. v = v | (v >> 1);
    61. v = v | (v >> 2);
    62. v = v | (v >> 4);
    63. v = v | (v >> 8);
    64. v = v | (v >> 16);
    65. v = v | (v >> 32);
    66. return qPopulationCount(~v);
    67. #endif
    68. }
    69. //改为 QT_POPCOUNT_RELAXED_CONSTEXPR
    70. QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(unsigned long v) Q_DECL_NOTHROW
    71. {
    72. return qCountLeadingZeroBits(QIntegerForSizeof<long>::Unsigned(v));
    73. }
    74. QT_WARNING_POP
    75. QT_END_NAMESPACE
    76. #endif // QALGORITHMS_H

    修改完后的文件

    1. /****************************************************************************
    2. **
    3. ** Copyright (C) 2016 The Qt Company Ltd.
    4. ** Contact: https://www.qt.io/licensing/
    5. **
    6. ** This file is part of the QtCore module of the Qt Toolkit.
    7. **
    8. ** $QT_BEGIN_LICENSE:LGPL$
    9. ** Commercial License Usage
    10. ** Licensees holding valid commercial Qt licenses may use this file in
    11. ** accordance with the commercial license agreement provided with the
    12. ** Software or, alternatively, in accordance with the terms contained in
    13. ** a written agreement between you and The Qt Company. For licensing terms
    14. ** and conditions see https://www.qt.io/terms-conditions. For further
    15. ** information use the contact form at https://www.qt.io/contact-us.
    16. **
    17. ** GNU Lesser General Public License Usage
    18. ** Alternatively, this file may be used under the terms of the GNU Lesser
    19. ** General Public License version 3 as published by the Free Software
    20. ** Foundation and appearing in the file LICENSE.LGPL3 included in the
    21. ** packaging of this file. Please review the following information to
    22. ** ensure the GNU Lesser General Public License version 3 requirements
    23. ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
    24. **
    25. ** GNU General Public License Usage
    26. ** Alternatively, this file may be used under the terms of the GNU
    27. ** General Public License version 2.0 or (at your option) the GNU General
    28. ** Public license version 3 or any later version approved by the KDE Free
    29. ** Qt Foundation. The licenses are as published by the Free Software
    30. ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
    31. ** included in the packaging of this file. Please review the following
    32. ** information to ensure the GNU General Public License requirements will
    33. ** be met: https://www.gnu.org/licenses/gpl-2.0.html and
    34. ** https://www.gnu.org/licenses/gpl-3.0.html.
    35. **
    36. ** $QT_END_LICENSE$
    37. **
    38. ****************************************************************************/
    39. #ifndef QALGORITHMS_H
    40. #define QALGORITHMS_H
    41. #include
    42. #if defined(Q_CC_MSVC) && _MSC_VER > 1500
    43. #include
    44. #endif
    45. QT_BEGIN_NAMESPACE
    46. QT_WARNING_PUSH
    47. QT_WARNING_DISABLE_DEPRECATED
    48. /*
    49. Warning: The contents of QAlgorithmsPrivate is not a part of the public Qt API
    50. and may be changed from version to version or even be completely removed.
    51. */
    52. namespace QAlgorithmsPrivate {
    53. #if QT_DEPRECATED_SINCE(5, 2)
    54. template <typename RandomAccessIterator, typename T, typename LessThan>
    55. QT_DEPRECATED_X("Use std::sort") Q_OUTOFLINE_TEMPLATE void qSortHelper(RandomAccessIterator start, RandomAccessIterator end, const T &t, LessThan lessThan);
    56. template <typename RandomAccessIterator, typename T>
    57. QT_DEPRECATED_X("Use std::sort") inline void qSortHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &dummy);
    58. template <typename RandomAccessIterator, typename T, typename LessThan>
    59. QT_DEPRECATED_X("Use std::stable_sort") Q_OUTOFLINE_TEMPLATE void qStableSortHelper(RandomAccessIterator start, RandomAccessIterator end, const T &t, LessThan lessThan);
    60. template <typename RandomAccessIterator, typename T>
    61. QT_DEPRECATED_X("Use std::stable_sort") inline void qStableSortHelper(RandomAccessIterator, RandomAccessIterator, const T &);
    62. template <typename RandomAccessIterator, typename T, typename LessThan>
    63. QT_DEPRECATED_X("Use std::lower_bound") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qLowerBoundHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan);
    64. template <typename RandomAccessIterator, typename T, typename LessThan>
    65. QT_DEPRECATED_X("Use std::upper_bound") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qUpperBoundHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan);
    66. template <typename RandomAccessIterator, typename T, typename LessThan>
    67. QT_DEPRECATED_X("Use std::binary_search") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qBinaryFindHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan);
    68. #endif // QT_DEPRECATED_SINCE(5, 2)
    69. }
    70. #if QT_DEPRECATED_SINCE(5, 2)
    71. template <typename InputIterator, typename OutputIterator>
    72. QT_DEPRECATED_X("Use std::copy") inline OutputIterator qCopy(InputIterator begin, InputIterator end, OutputIterator dest)
    73. {
    74. while (begin != end)
    75. *dest++ = *begin++;
    76. return dest;
    77. }
    78. template <typename BiIterator1, typename BiIterator2>
    79. QT_DEPRECATED_X("Use std::copy_backward") inline BiIterator2 qCopyBackward(BiIterator1 begin, BiIterator1 end, BiIterator2 dest)
    80. {
    81. while (begin != end)
    82. *--dest = *--end;
    83. return dest;
    84. }
    85. template <typename InputIterator1, typename InputIterator2>
    86. QT_DEPRECATED_X("Use std::equal") inline bool qEqual(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
    87. {
    88. for (; first1 != last1; ++first1, ++first2)
    89. if (!(*first1 == *first2))
    90. return false;
    91. return true;
    92. }
    93. template <typename ForwardIterator, typename T>
    94. QT_DEPRECATED_X("Use std::fill") inline void qFill(ForwardIterator first, ForwardIterator last, const T &val)
    95. {
    96. for (; first != last; ++first)
    97. *first = val;
    98. }
    99. template <typename Container, typename T>
    100. QT_DEPRECATED_X("Use std::fill") inline void qFill(Container &container, const T &val)
    101. {
    102. qFill(container.begin(), container.end(), val);
    103. }
    104. template <typename InputIterator, typename T>
    105. QT_DEPRECATED_X("Use std::find") inline InputIterator qFind(InputIterator first, InputIterator last, const T &val)
    106. {
    107. while (first != last && !(*first == val))
    108. ++first;
    109. return first;
    110. }
    111. template <typename Container, typename T>
    112. QT_DEPRECATED_X("Use std::find") inline typename Container::const_iterator qFind(const Container &container, const T &val)
    113. {
    114. return qFind(container.constBegin(), container.constEnd(), val);
    115. }
    116. template <typename InputIterator, typename T, typename Size>
    117. QT_DEPRECATED_X("Use std::count") inline void qCount(InputIterator first, InputIterator last, const T &value, Size &n)
    118. {
    119. for (; first != last; ++first)
    120. if (*first == value)
    121. ++n;
    122. }
    123. template <typename Container, typename T, typename Size>
    124. QT_DEPRECATED_X("Use std::count") inline void qCount(const Container &container, const T &value, Size &n)
    125. {
    126. qCount(container.constBegin(), container.constEnd(), value, n);
    127. }
    128. #ifdef Q_QDOC
    129. typedef void* LessThan;
    130. template <typename T> LessThan qLess();
    131. template <typename T> LessThan qGreater();
    132. #else
    133. template <typename T>
    134. class QT_DEPRECATED_X("Use std::less") qLess
    135. {
    136. public:
    137. inline bool operator()(const T &t1, const T &t2) const
    138. {
    139. return (t1 < t2);
    140. }
    141. };
    142. template <typename T>
    143. class QT_DEPRECATED_X("Use std::greater") qGreater
    144. {
    145. public:
    146. inline bool operator()(const T &t1, const T &t2) const
    147. {
    148. return (t2 < t1);
    149. }
    150. };
    151. #endif
    152. template <typename RandomAccessIterator>
    153. QT_DEPRECATED_X("Use std::sort") inline void qSort(RandomAccessIterator start, RandomAccessIterator end)
    154. {
    155. if (start != end)
    156. QAlgorithmsPrivate::qSortHelper(start, end, *start);
    157. }
    158. template <typename RandomAccessIterator, typename LessThan>
    159. QT_DEPRECATED_X("Use std::sort") inline void qSort(RandomAccessIterator start, RandomAccessIterator end, LessThan lessThan)
    160. {
    161. if (start != end)
    162. QAlgorithmsPrivate::qSortHelper(start, end, *start, lessThan);
    163. }
    164. template<typename Container>
    165. QT_DEPRECATED_X("Use std::sort") inline void qSort(Container &c)
    166. {
    167. #ifdef Q_CC_BOR
    168. // Work around Borland 5.5 optimizer bug
    169. c.detach();
    170. #endif
    171. if (!c.empty())
    172. QAlgorithmsPrivate::qSortHelper(c.begin(), c.end(), *c.begin());
    173. }
    174. template <typename RandomAccessIterator>
    175. QT_DEPRECATED_X("Use std::stable_sort") inline void qStableSort(RandomAccessIterator start, RandomAccessIterator end)
    176. {
    177. if (start != end)
    178. QAlgorithmsPrivate::qStableSortHelper(start, end, *start);
    179. }
    180. template <typename RandomAccessIterator, typename LessThan>
    181. QT_DEPRECATED_X("Use std::stable_sort") inline void qStableSort(RandomAccessIterator start, RandomAccessIterator end, LessThan lessThan)
    182. {
    183. if (start != end)
    184. QAlgorithmsPrivate::qStableSortHelper(start, end, *start, lessThan);
    185. }
    186. template<typename Container>
    187. QT_DEPRECATED_X("Use std::stable_sort") inline void qStableSort(Container &c)
    188. {
    189. #ifdef Q_CC_BOR
    190. // Work around Borland 5.5 optimizer bug
    191. c.detach();
    192. #endif
    193. if (!c.empty())
    194. QAlgorithmsPrivate::qStableSortHelper(c.begin(), c.end(), *c.begin());
    195. }
    196. template <typename RandomAccessIterator, typename T>
    197. QT_DEPRECATED_X("Use std::lower_bound") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qLowerBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value)
    198. {
    199. // Implementation is duplicated from QAlgorithmsPrivate to keep existing code
    200. // compiling. We have to allow using *begin and value with different types,
    201. // and then implementing operator< for those types.
    202. RandomAccessIterator middle;
    203. int n = end - begin;
    204. int half;
    205. while (n > 0) {
    206. half = n >> 1;
    207. middle = begin + half;
    208. if (*middle < value) {
    209. begin = middle + 1;
    210. n -= half + 1;
    211. } else {
    212. n = half;
    213. }
    214. }
    215. return begin;
    216. }
    217. template <typename RandomAccessIterator, typename T, typename LessThan>
    218. QT_DEPRECATED_X("Use std::lower_bound") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qLowerBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan)
    219. {
    220. return QAlgorithmsPrivate::qLowerBoundHelper(begin, end, value, lessThan);
    221. }
    222. template <typename Container, typename T>
    223. QT_DEPRECATED_X("Use std::lower_bound") Q_OUTOFLINE_TEMPLATE typename Container::const_iterator qLowerBound(const Container &container, const T &value)
    224. {
    225. return QAlgorithmsPrivate::qLowerBoundHelper(container.constBegin(), container.constEnd(), value, qLess());
    226. }
    227. template <typename RandomAccessIterator, typename T>
    228. QT_DEPRECATED_X("Use std::upper_bound") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qUpperBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value)
    229. {
    230. // Implementation is duplicated from QAlgorithmsPrivate.
    231. RandomAccessIterator middle;
    232. int n = end - begin;
    233. int half;
    234. while (n > 0) {
    235. half = n >> 1;
    236. middle = begin + half;
    237. if (value < *middle) {
    238. n = half;
    239. } else {
    240. begin = middle + 1;
    241. n -= half + 1;
    242. }
    243. }
    244. return begin;
    245. }
    246. template <typename RandomAccessIterator, typename T, typename LessThan>
    247. QT_DEPRECATED_X("Use std::upper_bound") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qUpperBound(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan)
    248. {
    249. return QAlgorithmsPrivate::qUpperBoundHelper(begin, end, value, lessThan);
    250. }
    251. template <typename Container, typename T>
    252. QT_DEPRECATED_X("Use std::upper_bound") Q_OUTOFLINE_TEMPLATE typename Container::const_iterator qUpperBound(const Container &container, const T &value)
    253. {
    254. return QAlgorithmsPrivate::qUpperBoundHelper(container.constBegin(), container.constEnd(), value, qLess());
    255. }
    256. template <typename RandomAccessIterator, typename T>
    257. QT_DEPRECATED_X("Use std::binary_search") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qBinaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T &value)
    258. {
    259. // Implementation is duplicated from QAlgorithmsPrivate.
    260. RandomAccessIterator it = qLowerBound(begin, end, value);
    261. if (it == end || value < *it)
    262. return end;
    263. return it;
    264. }
    265. template <typename RandomAccessIterator, typename T, typename LessThan>
    266. QT_DEPRECATED_X("Use std::binary_search") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qBinaryFind(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan)
    267. {
    268. return QAlgorithmsPrivate::qBinaryFindHelper(begin, end, value, lessThan);
    269. }
    270. template <typename Container, typename T>
    271. QT_DEPRECATED_X("Use std::binary_search") Q_OUTOFLINE_TEMPLATE typename Container::const_iterator qBinaryFind(const Container &container, const T &value)
    272. {
    273. return QAlgorithmsPrivate::qBinaryFindHelper(container.constBegin(), container.constEnd(), value, qLess());
    274. }
    275. #endif // QT_DEPRECATED_SINCE(5, 2)
    276. template <typename ForwardIterator>
    277. Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end)
    278. {
    279. while (begin != end) {
    280. delete *begin;
    281. ++begin;
    282. }
    283. }
    284. template <typename Container>
    285. inline void qDeleteAll(const Container &c)
    286. {
    287. qDeleteAll(c.begin(), c.end());
    288. }
    289. /*
    290. Warning: The contents of QAlgorithmsPrivate is not a part of the public Qt API
    291. and may be changed from version to version or even be completely removed.
    292. */
    293. namespace QAlgorithmsPrivate {
    294. #if QT_DEPRECATED_SINCE(5, 2)
    295. template <typename RandomAccessIterator, typename T, typename LessThan>
    296. QT_DEPRECATED_X("Use std::sort") Q_OUTOFLINE_TEMPLATE void qSortHelper(RandomAccessIterator start, RandomAccessIterator end, const T &t, LessThan lessThan)
    297. {
    298. top:
    299. int span = int(end - start);
    300. if (span < 2)
    301. return;
    302. --end;
    303. RandomAccessIterator low = start, high = end - 1;
    304. RandomAccessIterator pivot = start + span / 2;
    305. if (lessThan(*end, *start))
    306. qSwap(*end, *start);
    307. if (span == 2)
    308. return;
    309. if (lessThan(*pivot, *start))
    310. qSwap(*pivot, *start);
    311. if (lessThan(*end, *pivot))
    312. qSwap(*end, *pivot);
    313. if (span == 3)
    314. return;
    315. qSwap(*pivot, *end);
    316. while (low < high) {
    317. while (low < high && lessThan(*low, *end))
    318. ++low;
    319. while (high > low && lessThan(*end, *high))
    320. --high;
    321. if (low < high) {
    322. qSwap(*low, *high);
    323. ++low;
    324. --high;
    325. } else {
    326. break;
    327. }
    328. }
    329. if (lessThan(*low, *end))
    330. ++low;
    331. qSwap(*end, *low);
    332. qSortHelper(start, low, t, lessThan);
    333. start = low + 1;
    334. ++end;
    335. goto top;
    336. }
    337. template <typename RandomAccessIterator, typename T>
    338. QT_DEPRECATED_X("Use std::sort") inline void qSortHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &dummy)
    339. {
    340. qSortHelper(begin, end, dummy, qLess());
    341. }
    342. template <typename RandomAccessIterator>
    343. QT_DEPRECATED_X("Use std::reverse") Q_OUTOFLINE_TEMPLATE void qReverse(RandomAccessIterator begin, RandomAccessIterator end)
    344. {
    345. --end;
    346. while (begin < end)
    347. qSwap(*begin++, *end--);
    348. }
    349. template <typename RandomAccessIterator>
    350. QT_DEPRECATED_X("Use std::rotate") Q_OUTOFLINE_TEMPLATE void qRotate(RandomAccessIterator begin, RandomAccessIterator middle, RandomAccessIterator end)
    351. {
    352. qReverse(begin, middle);
    353. qReverse(middle, end);
    354. qReverse(begin, end);
    355. }
    356. template <typename RandomAccessIterator, typename T, typename LessThan>
    357. QT_DEPRECATED_X("Use std::merge") Q_OUTOFLINE_TEMPLATE void qMerge(RandomAccessIterator begin, RandomAccessIterator pivot, RandomAccessIterator end, T &t, LessThan lessThan)
    358. {
    359. const int len1 = pivot - begin;
    360. const int len2 = end - pivot;
    361. if (len1 == 0 || len2 == 0)
    362. return;
    363. if (len1 + len2 == 2) {
    364. if (lessThan(*(begin + 1), *(begin)))
    365. qSwap(*begin, *(begin + 1));
    366. return;
    367. }
    368. RandomAccessIterator firstCut;
    369. RandomAccessIterator secondCut;
    370. int len2Half;
    371. if (len1 > len2) {
    372. const int len1Half = len1 / 2;
    373. firstCut = begin + len1Half;
    374. secondCut = qLowerBound(pivot, end, *firstCut, lessThan);
    375. len2Half = secondCut - pivot;
    376. } else {
    377. len2Half = len2 / 2;
    378. secondCut = pivot + len2Half;
    379. firstCut = qUpperBound(begin, pivot, *secondCut, lessThan);
    380. }
    381. qRotate(firstCut, pivot, secondCut);
    382. const RandomAccessIterator newPivot = firstCut + len2Half;
    383. qMerge(begin, firstCut, newPivot, t, lessThan);
    384. qMerge(newPivot, secondCut, end, t, lessThan);
    385. }
    386. template <typename RandomAccessIterator, typename T, typename LessThan>
    387. QT_DEPRECATED_X("Use std::stable_sort") Q_OUTOFLINE_TEMPLATE void qStableSortHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &t, LessThan lessThan)
    388. {
    389. const int span = end - begin;
    390. if (span < 2)
    391. return;
    392. const RandomAccessIterator middle = begin + span / 2;
    393. qStableSortHelper(begin, middle, t, lessThan);
    394. qStableSortHelper(middle, end, t, lessThan);
    395. qMerge(begin, middle, end, t, lessThan);
    396. }
    397. template <typename RandomAccessIterator, typename T>
    398. QT_DEPRECATED_X("Use std::stable_sort") inline void qStableSortHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &dummy)
    399. {
    400. qStableSortHelper(begin, end, dummy, qLess());
    401. }
    402. template <typename RandomAccessIterator, typename T, typename LessThan>
    403. QT_DEPRECATED_X("Use std::lower_bound") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qLowerBoundHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan)
    404. {
    405. RandomAccessIterator middle;
    406. int n = int(end - begin);
    407. int half;
    408. while (n > 0) {
    409. half = n >> 1;
    410. middle = begin + half;
    411. if (lessThan(*middle, value)) {
    412. begin = middle + 1;
    413. n -= half + 1;
    414. } else {
    415. n = half;
    416. }
    417. }
    418. return begin;
    419. }
    420. template <typename RandomAccessIterator, typename T, typename LessThan>
    421. QT_DEPRECATED_X("Use std::upper_bound") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qUpperBoundHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan)
    422. {
    423. RandomAccessIterator middle;
    424. int n = end - begin;
    425. int half;
    426. while (n > 0) {
    427. half = n >> 1;
    428. middle = begin + half;
    429. if (lessThan(value, *middle)) {
    430. n = half;
    431. } else {
    432. begin = middle + 1;
    433. n -= half + 1;
    434. }
    435. }
    436. return begin;
    437. }
    438. template <typename RandomAccessIterator, typename T, typename LessThan>
    439. QT_DEPRECATED_X("Use std::binary_search") Q_OUTOFLINE_TEMPLATE RandomAccessIterator qBinaryFindHelper(RandomAccessIterator begin, RandomAccessIterator end, const T &value, LessThan lessThan)
    440. {
    441. RandomAccessIterator it = qLowerBoundHelper(begin, end, value, lessThan);
    442. if (it == end || lessThan(value, *it))
    443. return end;
    444. return it;
    445. }
    446. #endif // QT_DEPRECATED_SINCE(5, 2)
    447. #ifdef Q_CC_CLANG
    448. // Clang had a bug where __builtin_ctz/clz/popcount were not marked as constexpr.
    449. # if (defined __apple_build_version__ && __clang_major__ >= 7) || (Q_CC_CLANG >= 307)
    450. # define QT_HAS_CONSTEXPR_BUILTINS
    451. # endif
    452. #elif defined(Q_CC_MSVC) && !defined(Q_CC_INTEL) && !defined(Q_OS_WINCE) && !defined(Q_PROCESSOR_ARM)
    453. # define QT_HAS_CONSTEXPR_BUILTINS
    454. #elif defined(Q_CC_GNU)
    455. # define QT_HAS_CONSTEXPR_BUILTINS
    456. #endif
    457. #if defined QT_HAS_CONSTEXPR_BUILTINS
    458. #if defined(Q_CC_GNU) || defined(Q_CC_CLANG)
    459. # define QT_HAS_BUILTIN_CTZS
    460. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) Q_DECL_NOTHROW
    461. {
    462. # if QT_HAS_BUILTIN(__builtin_ctzs)
    463. return __builtin_ctzs(v);
    464. # else
    465. return __builtin_ctz(v);
    466. # endif
    467. }
    468. #define QT_HAS_BUILTIN_CLZS
    469. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) Q_DECL_NOTHROW
    470. {
    471. # if QT_HAS_BUILTIN(__builtin_clzs)
    472. return __builtin_clzs(v);
    473. # else
    474. return __builtin_clz(v) - 16U;
    475. # endif
    476. }
    477. #define QT_HAS_BUILTIN_CTZ
    478. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctz(quint32 v) Q_DECL_NOTHROW
    479. {
    480. return __builtin_ctz(v);
    481. }
    482. #define QT_HAS_BUILTIN_CLZ
    483. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clz(quint32 v) Q_DECL_NOTHROW
    484. {
    485. return __builtin_clz(v);
    486. }
    487. #define QT_HAS_BUILTIN_CTZLL
    488. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_ctzll(quint64 v) Q_DECL_NOTHROW
    489. {
    490. return __builtin_ctzll(v);
    491. }
    492. #define QT_HAS_BUILTIN_CLZLL
    493. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_clzll(quint64 v) Q_DECL_NOTHROW
    494. {
    495. return __builtin_clzll(v);
    496. }
    497. #define QALGORITHMS_USE_BUILTIN_POPCOUNT
    498. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint32 v) Q_DECL_NOTHROW
    499. {
    500. return __builtin_popcount(v);
    501. }
    502. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint8 v) Q_DECL_NOTHROW
    503. {
    504. return __builtin_popcount(v);
    505. }
    506. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcount(quint16 v) Q_DECL_NOTHROW
    507. {
    508. return __builtin_popcount(v);
    509. }
    510. #define QALGORITHMS_USE_BUILTIN_POPCOUNTLL
    511. Q_DECL_CONSTEXPR Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NOTHROW
    512. {
    513. return __builtin_popcountll(v);
    514. }
    515. #elif defined(Q_CC_MSVC) && !defined(Q_OS_WINCE) && !defined(Q_PROCESSOR_ARM)
    516. #define QT_POPCOUNT_CONSTEXPR
    517. #define QT_POPCOUNT_RELAXED_CONSTEXPR
    518. #define QT_HAS_BUILTIN_CTZ
    519. Q_ALWAYS_INLINE unsigned long qt_builtin_ctz(quint32 val)
    520. {
    521. unsigned long result;
    522. _BitScanForward(&result, val);
    523. return result;
    524. }
    525. #define QT_HAS_BUILTIN_CLZ
    526. Q_ALWAYS_INLINE unsigned long qt_builtin_clz(quint32 val)
    527. {
    528. unsigned long result;
    529. _BitScanReverse(&result, val);
    530. // Now Invert the result: clz will count *down* from the msb to the lsb, so the msb index is 31
    531. // and the lsb index is 0. The result for the index when counting up: msb index is 0 (because it
    532. // starts there), and the lsb index is 31.
    533. result ^= sizeof(quint32) * 8 - 1;
    534. return result;
    535. }
    536. #if Q_PROCESSOR_WORDSIZE == 8
    537. // These are only defined for 64bit builds.
    538. #define QT_HAS_BUILTIN_CTZLL
    539. Q_ALWAYS_INLINE unsigned long qt_builtin_ctzll(quint64 val)
    540. {
    541. unsigned long result;
    542. _BitScanForward64(&result, val);
    543. return result;
    544. }
    545. // MSVC calls it _BitScanReverse and returns the carry flag, which we don't need
    546. #define QT_HAS_BUILTIN_CLZLL
    547. Q_ALWAYS_INLINE unsigned long qt_builtin_clzll(quint64 val)
    548. {
    549. unsigned long result;
    550. _BitScanReverse64(&result, val);
    551. // see qt_builtin_clz
    552. result ^= sizeof(quint64) * 8 - 1;
    553. return result;
    554. }
    555. #endif // MSVC 64bit
    556. # define QT_HAS_BUILTIN_CTZS
    557. Q_ALWAYS_INLINE uint qt_builtin_ctzs(quint16 v) Q_DECL_NOTHROW
    558. {
    559. return qt_builtin_ctz(v);
    560. }
    561. #define QT_HAS_BUILTIN_CLZS
    562. Q_ALWAYS_INLINE uint qt_builtin_clzs(quint16 v) Q_DECL_NOTHROW
    563. {
    564. return qt_builtin_clz(v) - 16U;
    565. }
    566. // Neither MSVC nor the Intel compiler define a macro for the POPCNT processor
    567. // feature, so we're using either the SSE4.2 or the AVX macro as a proxy (Clang
    568. // does define the macro). It's incorrect for two reasons:
    569. // 1. It's a separate bit in CPUID, so a processor could implement SSE4.2 and
    570. // not POPCNT, but that's unlikely to happen.
    571. // 2. There are processors that support POPCNT but not AVX (Intel Nehalem
    572. // architecture), but unlike the other compilers, MSVC has no option
    573. // to generate code for those processors.
    574. // So it's an acceptable compromise.
    575. #if defined(__AVX__) || defined(__SSE4_2__) || defined(__POPCNT__)
    576. #define QALGORITHMS_USE_BUILTIN_POPCOUNT
    577. Q_ALWAYS_INLINE uint qt_builtin_popcount(quint32 v) Q_DECL_NOTHROW
    578. {
    579. return __popcnt(v);
    580. }
    581. Q_ALWAYS_INLINE uint qt_builtin_popcount(quint8 v) Q_DECL_NOTHROW
    582. {
    583. return __popcnt16(v);
    584. }
    585. Q_ALWAYS_INLINE uint qt_builtin_popcount(quint16 v) Q_DECL_NOTHROW
    586. {
    587. return __popcnt16(v);
    588. }
    589. #if Q_PROCESSOR_WORDSIZE == 8
    590. #define QALGORITHMS_USE_BUILTIN_POPCOUNTLL
    591. Q_ALWAYS_INLINE uint qt_builtin_popcountll(quint64 v) Q_DECL_NOTHROW
    592. {
    593. return __popcnt64(v);
    594. }
    595. #endif // MSVC 64bit
    596. #endif // __AVX__ || __SSE4_2__ || __POPCNT__
    597. #endif // MSVC
    598. #endif // QT_HAS_CONSTEXPR_BUILTINS
    599. #ifndef QT_POPCOUNT_CONSTEXPR
    600. #define QT_POPCOUNT_CONSTEXPR Q_DECL_CONSTEXPR
    601. #define QT_POPCOUNT_RELAXED_CONSTEXPR Q_DECL_RELAXED_CONSTEXPR
    602. #endif
    603. } //namespace QAlgorithmsPrivate
    604. Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint32 v) Q_DECL_NOTHROW
    605. {
    606. #ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT
    607. return QAlgorithmsPrivate::qt_builtin_popcount(v);
    608. #else
    609. // See http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
    610. return
    611. (((v ) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
    612. (((v >> 12) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
    613. (((v >> 24) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;
    614. #endif
    615. }
    616. Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint8 v) Q_DECL_NOTHROW
    617. {
    618. #ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT
    619. return QAlgorithmsPrivate::qt_builtin_popcount(v);
    620. #else
    621. return
    622. (((v ) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;
    623. #endif
    624. }
    625. Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint16 v) Q_DECL_NOTHROW
    626. {
    627. #ifdef QALGORITHMS_USE_BUILTIN_POPCOUNT
    628. return QAlgorithmsPrivate::qt_builtin_popcount(v);
    629. #else
    630. return
    631. (((v ) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
    632. (((v >> 12) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;
    633. #endif
    634. }
    635. Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(quint64 v) Q_DECL_NOTHROW
    636. {
    637. #ifdef QALGORITHMS_USE_BUILTIN_POPCOUNTLL
    638. return QAlgorithmsPrivate::qt_builtin_popcountll(v);
    639. #else
    640. return
    641. (((v ) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
    642. (((v >> 12) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
    643. (((v >> 24) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
    644. (((v >> 36) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
    645. (((v >> 48) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f +
    646. (((v >> 60) & 0xfff) * Q_UINT64_C(0x1001001001001) & Q_UINT64_C(0x84210842108421)) % 0x1f;
    647. #endif
    648. }
    649. Q_DECL_CONST_FUNCTION QT_POPCOUNT_CONSTEXPR inline uint qPopulationCount(long unsigned int v) Q_DECL_NOTHROW
    650. {
    651. return qPopulationCount(static_cast(v));
    652. }
    653. #if defined(Q_CC_GNU) && !defined(Q_CC_CLANG)
    654. #undef QALGORITHMS_USE_BUILTIN_POPCOUNT
    655. #endif
    656. #undef QT_POPCOUNT_CONSTEXPR
    657. Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint32 v) Q_DECL_NOTHROW
    658. {
    659. #if defined(QT_HAS_BUILTIN_CTZ)
    660. return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 32U;
    661. #else
    662. // see http://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightParallel
    663. unsigned int c = 32; // c will be the number of zero bits on the right
    664. v &= -signed(v);
    665. if (v) c--;
    666. if (v & 0x0000FFFF) c -= 16;
    667. if (v & 0x00FF00FF) c -= 8;
    668. if (v & 0x0F0F0F0F) c -= 4;
    669. if (v & 0x33333333) c -= 2;
    670. if (v & 0x55555555) c -= 1;
    671. return c;
    672. #endif
    673. }
    674. Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint8 v) Q_DECL_NOTHROW
    675. {
    676. #if defined(QT_HAS_BUILTIN_CTZ)
    677. return v ? QAlgorithmsPrivate::qt_builtin_ctz(v) : 8U;
    678. #else
    679. unsigned int c = 8; // c will be the number of zero bits on the right
    680. v &= -signed(v);
    681. if (v) c--;
    682. if (v & 0x0000000F) c -= 4;
    683. if (v & 0x00000033) c -= 2;
    684. if (v & 0x00000055) c -= 1;
    685. return c;
    686. #endif
    687. }
    688. Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint16 v) Q_DECL_NOTHROW
    689. {
    690. #if defined(QT_HAS_BUILTIN_CTZS)
    691. return v ? QAlgorithmsPrivate::qt_builtin_ctzs(v) : 16U;
    692. #else
    693. unsigned int c = 16; // c will be the number of zero bits on the right
    694. v &= -signed(v);
    695. if (v) c--;
    696. if (v & 0x000000FF) c -= 8;
    697. if (v & 0x00000F0F) c -= 4;
    698. if (v & 0x00003333) c -= 2;
    699. if (v & 0x00005555) c -= 1;
    700. return c;
    701. #endif
    702. }
    703. Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(quint64 v) Q_DECL_NOTHROW
    704. {
    705. #if defined(QT_HAS_BUILTIN_CTZLL)
    706. return v ? QAlgorithmsPrivate::qt_builtin_ctzll(v) : 64;
    707. #else
    708. quint32 x = static_cast(v);
    709. return x ? qCountTrailingZeroBits(x)
    710. : 32 + qCountTrailingZeroBits(static_cast(v >> 32));
    711. #endif
    712. }
    713. Q_DECL_RELAXED_CONSTEXPR inline uint qCountTrailingZeroBits(unsigned long v) Q_DECL_NOTHROW
    714. {
    715. return qCountTrailingZeroBits(QIntegerForSizeof<long>::Unsigned(v));
    716. }
    717. Q_DECL_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint32 v) Q_DECL_NOTHROW
    718. {
    719. #if defined(QT_HAS_BUILTIN_CLZ)
    720. return v ? QAlgorithmsPrivate::qt_builtin_clz(v) : 32U;
    721. #else
    722. // Hacker's Delight, 2nd ed. Fig 5-16, p. 102
    723. v = v | (v >> 1);
    724. v = v | (v >> 2);
    725. v = v | (v >> 4);
    726. v = v | (v >> 8);
    727. v = v | (v >> 16);
    728. return qPopulationCount(~v);
    729. #endif
    730. }
    731. QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint8 v) Q_DECL_NOTHROW
    732. {
    733. #if defined(QT_HAS_BUILTIN_CLZ)
    734. return v ? QAlgorithmsPrivate::qt_builtin_clz(v)-24U : 8U;
    735. #else
    736. v = v | (v >> 1);
    737. v = v | (v >> 2);
    738. v = v | (v >> 4);
    739. return qPopulationCount(static_cast(~v));
    740. #endif
    741. }
    742. QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint16 v) Q_DECL_NOTHROW
    743. {
    744. #if defined(QT_HAS_BUILTIN_CLZS)
    745. return v ? QAlgorithmsPrivate::qt_builtin_clzs(v) : 16U;
    746. #else
    747. v = v | (v >> 1);
    748. v = v | (v >> 2);
    749. v = v | (v >> 4);
    750. v = v | (v >> 8);
    751. return qPopulationCount(static_cast(~v));
    752. #endif
    753. }
    754. QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(quint64 v) Q_DECL_NOTHROW
    755. {
    756. #if defined(QT_HAS_BUILTIN_CLZLL)
    757. return v ? QAlgorithmsPrivate::qt_builtin_clzll(v) : 64U;
    758. #else
    759. v = v | (v >> 1);
    760. v = v | (v >> 2);
    761. v = v | (v >> 4);
    762. v = v | (v >> 8);
    763. v = v | (v >> 16);
    764. v = v | (v >> 32);
    765. return qPopulationCount(~v);
    766. #endif
    767. }
    768. QT_POPCOUNT_RELAXED_CONSTEXPR inline uint qCountLeadingZeroBits(unsigned long v) Q_DECL_NOTHROW
    769. {
    770. return qCountLeadingZeroBits(QIntegerForSizeof<long>::Unsigned(v));
    771. }
    772. QT_WARNING_POP
    773. QT_END_NAMESPACE
    774. #endif // QALGORITHMS_H

    dm使用

    1. //MainWindow.h
    2. #ifndef MAINWINDOW_H
    3. #define MAINWINDOW_H
    4. #include
    5. #include
    6. QT_BEGIN_NAMESPACE
    7. namespace Ui { class MainWindow; }
    8. QT_END_NAMESPACE
    9. class MainWindow : public QMainWindow
    10. {
    11. Q_OBJECT
    12. public:
    13. MainWindow(QWidget *parent = nullptr);
    14. ~MainWindow();
    15. private:
    16. Ui::MainWindow *ui;
    17. Dm::Idmsoft dm;
    18. };
    19. #endif // MAINWINDOW_H

     

    1. //mainwindow.cpp
    2. #include "mainwindow.h"
    3. #include "ui_mainwindow.h"
    4. #include
    5. MainWindow::MainWindow(QWidget *parent)
    6. : QMainWindow(parent)
    7. , ui(new Ui::MainWindow)
    8. {
    9. ui->setupUi(this);
    10. if(dm.setControl("dm.dmsoft"))//初始化COM对象
    11. {
    12. qDebug() << QStringLiteral("大漠测试,大漠版本:")<< dm.Ver();
    13. }
    14. }
    15. MainWindow::~MainWindow()
    16. {
    17. delete ui;
    18. }

    不管是debug 还是 release 。都能成功运行。运行后打印

    这就代表大漠已经成功调通,接下来就可以正常开发了 

  • 相关阅读:
    【Node入门系列】前后端的身份认证 — JWT(10)
    阿里二面:SpringBoot如何优雅地进行响应数据封装、异常处理?
    第三章:Qt Creator 之 3.5 构建与运行程序
    系统架构图
    从事电力行业施工需要什么资质,电力工程资质有什么作用
    【netty从入门到放弃】netty转发tcp数据到多客户端
    VMware Network Adapter VMnet8图标没显示怎么办?
    matlab 遗传算法GA优化汽车四分之一车体主动悬架PID
    没有预热,不叫高并发「限流算法第三把法器:令牌桶算法」
    【无标题】
  • 原文地址:https://blog.csdn.net/hu626626/article/details/134261301