📄 qglobal.cpp
字号:
winver = QSysInfo::WV_98; else winver = QSysInfo::WV_95; break;#ifdef Q_OS_TEMP case VER_PLATFORM_WIN32_CE:#ifdef Q_OS_TEMP if (qt_cever >= 400) winver = QSysInfo::WV_CENET; else#endif winver = QSysInfo::WV_CE; break;#endif default: // VER_PLATFORM_WIN32_NT if (osver.dwMajorVersion < 5) { winver = QSysInfo::WV_NT; } else if (osver.dwMajorVersion == 6) { winver = QSysInfo::WV_VISTA; } else if (osver.dwMinorVersion == 0) { winver = QSysInfo::WV_2000; } else if (osver.dwMinorVersion == 1) { winver = QSysInfo::WV_XP; } else if (osver.dwMinorVersion == 2) { winver = QSysInfo::WV_2003; } else { qWarning("Qt: Untested Windows version detected!"); winver = QSysInfo::WV_NT_based; } }#ifdef QT_DEBUG { QByteArray override = qgetenv("QT_WINVER_OVERRIDE"); if (override.isEmpty()) return winver; if (override == "Me") winver = QSysInfo::WV_Me; if (override == "95") winver = QSysInfo::WV_95; else if (override == "98") winver = QSysInfo::WV_98; else if (override == "NT") winver = QSysInfo::WV_NT; else if (override == "2000") winver = QSysInfo::WV_2000; else if (override == "2003") winver = QSysInfo::WV_2003; else if (override == "XP") winver = QSysInfo::WV_XP; else if (override == "VISTA") winver = QSysInfo::WV_VISTA; }#endif return winver;}const QSysInfo::WinVersion QSysInfo::WindowsVersion = winVersion();#endif/*! \macro void Q_ASSERT(bool test) \relates <QtGlobal> Prints a warning message containing the source code file name and line number if \a test is false. Q_ASSERT() is useful for testing pre- and post-conditions during development. It does nothing if \c QT_NO_DEBUG was defined during compilation. Example: \code // File: div.cpp #include <QtGlobal> int divide(int a, int b) { Q_ASSERT(b != 0); return a / b; } \endcode If \c b is zero, the Q_ASSERT statement will output the following message using the qFatal() function: \code ASSERT: "b == 0" in file div.cpp, line 7 \endcode \sa Q_ASSERT_X(), qFatal(), {Debugging Techniques}*//*! \macro void Q_ASSERT_X(bool test, const char *where, const char *what) \relates <QtGlobal> Prints the message \a what together with the location \a where, the source file name and line number if \a test is false. Q_ASSERT_X is useful for testing pre- and post-conditions during development. It does nothing if \c QT_NO_DEBUG was defined during compilation. Example: \code // File: div.cpp #include <QtGlobal> int divide(int a, int b) { Q_ASSERT_X(b != 0, "divide", "division by zero"); return a / b; } \endcode If \c b is zero, the Q_ASSERT_X statement will output the following message using the qFatal() function: \code ASSERT failure in divide: "division by zero", file div.cpp, line 7 \endcode \sa Q_ASSERT(), qFatal(), {Debugging Techniques}*//*! \macro void Q_CHECK_PTR(void *pointer) \relates <QtGlobal> If \a pointer is 0, prints a warning message containing the source code's file name and line number, saying that the program ran out of memory. Q_CHECK_PTR does nothing if \c QT_NO_DEBUG was defined during compilation. Example: \code int *a; Q_CHECK_PTR(a = new int[80]); // WRONG! a = new (nothrow) int[80]; // Right Q_CHECK_PTR(a); \endcode \sa qWarning(), {Debugging Techniques}*//* The Q_CHECK_PTR macro calls this function if an allocation check fails.*/void qt_check_pointer(const char *n, int l){ qWarning("In file %s, line %d: Out of memory", n, l);}/* The Q_ASSERT macro calls this this function when the test fails.*/void qt_assert(const char *assertion, const char *file, int line){ qFatal("ASSERT: \"%s\" in file %s, line %d", assertion, file, line);}/* The Q_ASSERT_X macro calls this this function when the test fails.*/void qt_assert_x(const char *where, const char *what, const char *file, int line){ qFatal("ASSERT failure in %s: \"%s\", file %s, line %d", where, what, file, line);}/* Dijkstra's bisection algorithm to find the square root of an integer. Deliberately not exported as part of the Qt API, but used in both qsimplerichtext.cpp and qgfxraster_qws.cpp*/Q_CORE_EXPORT unsigned int qt_int_sqrt(unsigned int n){ // n must be in the range 0...UINT_MAX/2-1 if (n >= (UINT_MAX>>2)) { unsigned int r = 2 * qt_int_sqrt(n / 4); unsigned int r2 = r + 1; return (n >= r2 * r2) ? r2 : r; } uint h, p= 0, q= 1, r= n; while (q <= n) q <<= 2; while (q != 1) { q >>= 2; h= p + q; p >>= 1; if (r >= h) { p += q; r -= h; } } return p;}#if defined(qMemCopy)# undef qMemCopy#endif#if defined(qMemSet)# undef qMemSet#endifvoid *qMalloc(size_t size) { return ::malloc(size); }void qFree(void *ptr) { ::free(ptr); }void *qRealloc(void *ptr, size_t size) { return ::realloc(ptr, size); }void *qMemCopy(void *dest, const void *src, size_t n) { return memcpy(dest, src, n); }void *qMemSet(void *dest, int c, size_t n) { return memset(dest, c, n); }static QtMsgHandler handler = 0; // pointer to debug handlerstatic const int QT_BUFFER_LENGTH = 8192; // internal buffer length#ifdef Q_CC_MWERKS#include <CoreServices/CoreServices.h>extern bool qt_is_gui_used;static void mac_default_handler(const char *msg){ if (qt_is_gui_used) { Str255 pmsg; qt_mac_to_pascal_string(msg, pmsg); DebugStr(pmsg); } else { fprintf(stderr, msg); }}#endif // Q_CC_MWERKSQString qt_error_string(int errorCode){ const char *s = 0; QString ret; if (errorCode == -1) {#if defined(Q_OS_WIN32) errorCode = GetLastError();#else errorCode = errno;#endif } switch (errorCode) { case 0: break; case EACCES: s = QT_TRANSLATE_NOOP("QIODevice", "Permission denied"); break; case EMFILE: s = QT_TRANSLATE_NOOP("QIODevice", "Too many open files"); break; case ENOENT: s = QT_TRANSLATE_NOOP("QIODevice", "No such file or directory"); break; case ENOSPC: s = QT_TRANSLATE_NOOP("QIODevice", "No space left on device"); break; default: {#ifdef Q_OS_WIN QT_WA({ unsigned short *string = 0; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&string, 0, NULL); ret = QString::fromUtf16(string); LocalFree((HLOCAL)string); }, { char *string = 0; FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&string, 0, NULL); ret = QString::fromLocal8Bit(string); LocalFree((HLOCAL)string); });#elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && _POSIX_VERSION >= 200112L QByteArray buf(1024, '\0'); strerror_r(errorCode, buf.data(), buf.size()); ret = QString::fromLocal8Bit(buf.constData());#else ret = QString::fromLocal8Bit(strerror(errorCode));#endif break; } } if (s) // ######## this breaks moc build currently// ret = QCoreApplication::translate("QIODevice", s); ret = QString::fromLatin1(s); return ret.trimmed();}/*! \fn QtMsgHandler qInstallMsgHandler(QtMsgHandler handler) \relates <QtGlobal> Installs a Qt message \a handler whis has been defined previously. Returns a pointer to the message \a handler. The message handler is a function that prints out debug messages, warnings, critical and fatal error messages. The Qt library (debug version) contains hundreds of warning messages that are printed when internal errors (usually invalid function arguments) occur. If you implement your own message handler, you get total control of these messages. The default message handler prints the message to the standard output under X11 or to the debugger under Windows. If it is a fatal message, the application aborts immediately. Only one message handler can be defined, since this is usually done on an application-wide basis to control debug output. To restore the message handler, call \c qInstallMsgHandler(0). Example: \code #include <qapplication.h> #include <stdio.h> #include <stdlib.h> void myMessageOutput(QtMsgType type, const char *msg) { switch (type) { case QtDebugMsg: fprintf(stderr, "Debug: %s\n", msg); break; case QtWarningMsg: fprintf(stderr, "Warning: %s\n", msg); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s\n", msg); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s\n", msg); abort(); } } int main(int argc, char **argv) { qInstallMsgHandler(myMessageOutput); QApplication app(argc, argv); ... return app.exec(); } \endcode \sa qDebug(), qWarning(), qCritical(), qFatal(), QtMsgType, {Debugging Techniques}*/QtMsgHandler qInstallMsgHandler(QtMsgHandler h){ QtMsgHandler old = handler; handler = h; return old;}void qt_message_output(QtMsgType msgType, const char *buf){ if (handler) { (*handler)(msgType, buf); } else {#if defined(Q_CC_MWERKS) mac_default_handler(buf);#elif defined(Q_OS_TEMP) QString fstr(buf); OutputDebugString((fstr + "\n").utf16());#else fprintf(stderr, "%s\n", buf); fflush(stderr);#endif } if (msgType == QtFatalMsg || (msgType == QtWarningMsg && (!qgetenv("QT_FATAL_WARNINGS").isNull())) ) {#if defined(Q_CC_MSVC) && defined(QT_DEBUG) && defined(_DEBUG) && defined(_CRT_ERROR) // get the current report mode int reportMode = _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW); _CrtSetReportMode(_CRT_ERROR, reportMode); int ret = _CrtDbgReport(_CRT_ERROR, __FILE__, __LINE__, QT_VERSION_STR, buf); if (ret == 0 && reportMode & _CRTDBG_MODE_WNDW) return; // ignore else if (ret == 1) _CrtDbgBreak();#endif#if defined(Q_OS_UNIX) && defined(QT_DEBUG) abort(); // trap; generates core dump#else exit(1); // goodbye cruel world#endif }}#undef qDebug/*! \relates <QtGlobal> Calls the message handler with the debug message \a msg. If no message handler has been installed, the message is printed to stderr. Under Windows, the message is sent to the debugger. This function does nothing if \c QT_NO_DEBUG_OUTPUT was defined during compilation. If you pass the function a format string and a list of arguments, it works in similar way to the C printf() function. Example: \code qDebug("Items in list: %d", myList.size()); \endcode If you include \c <QtDebug>, a more convenient syntax is also available: \code qDebug() << "Brush:" << myQBrush << "Other value:" << i; \endcode This syntax automatically puts a single space between each item, and outputs a newline at the end. It supports many C++ and Qt types. \warning The internal buffer is limited to 8192 bytes, including the '\0'-terminator. \warning Passing (const char *)0 as argument to qDebug might lead to crashes on certain platforms due to the platform's printf() implementation. \sa qWarning(), qCritical(), qFatal(), qInstallMsgHandler(), {Debugging Techniques}*/void qDebug(const char *msg, ...){ char buf[QT_BUFFER_LENGTH]; buf[QT_BUFFER_LENGTH - 1] = '\0'; va_list ap; va_start(ap, msg); // use variable arg list qvsnprintf(buf, QT_BUFFER_LENGTH - 1, msg, ap); va_end(ap); qt_message_output(QtDebugMsg, buf);}#undef qWarning/*! \relates <QtGlobal> Calls the message handler with the warning message \a msg. If no message handler has been installed, the message is printed to stderr. Under Windows, the message is sent to the debugger. This function does nothing if \c QT_NO_WARNING_OUTPUT was defined during compilation; it exits if the environment variable \c QT_FATAL_WARNINGS is defined. This function takes a format string and a list of arguments, similar to the C printf() function. Example: \code void f(int c) { if (c > 200) qWarning("f: bad argument, c == %d", c); } \endcode \warning The internal buffer is limited to 8192 bytes, including the '\0'-terminator. \warning Passing (const char *)0 as argument to qWarning might lead to crashes on certain platforms due to the platforms printf implementation. \sa qDebug(), qCritical(), qFatal(), qInstallMsgHandler(), {Debugging Techniques}*/void qWarning(const char *msg, ...){ char buf[QT_BUFFER_LENGTH]; buf[QT_BUFFER_LENGTH - 1] = '\0'; va_list ap; va_start(ap, msg); // use variable arg list qvsnprintf(buf, QT_BUFFER_LENGTH - 1, msg, ap); va_end(ap); qt_message_output(QtWarningMsg, buf);}/*! \relates <QtGlobal> Calls the message handler with the critical message \a msg. If no message handler has been installed, the message is printed to stderr. Under Windows, the message is sent to the debugger. This function takes a format string and a list of arguments, similar to the C printf() function. Example: \code void load(const QString &fileName) { QFile file(fileName); if (!file.exists())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -