diff --git a/Audio/tools/record_time_signal.cpp b/Audio/tools/record_time_signal.cpp index 6a78a0a2c..a54c78c65 100644 --- a/Audio/tools/record_time_signal.cpp +++ b/Audio/tools/record_time_signal.cpp @@ -67,16 +67,34 @@ public: private: Q_SLOT void start_recording () { - qtout << "started recording at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; + qtout << "started recording at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; source_.start (output_); if (!notify_interval_) QTimer::singleShot (duration_ * 1000, Qt::PreciseTimer, this, &Record::stop_recording); - qtout << QString {"buffer size used is: %1"}.arg (source_.bufferSize ()) << endl; + qtout << QString {"buffer size used is: %1"}.arg (source_.bufferSize ()) +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; } Q_SLOT void notify () { auto length = source_.elapsedUSecs (); - qtout << QString {"%1 μs recorded\r"}.arg (length) << flush; + qtout << QString {"%1 μs recorded\r"}.arg (length) +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + << Qt::flush +#else + << flush +#endif + ; if (length >= duration_ * 1000 * 1000) stop_recording (); } @@ -85,7 +103,13 @@ private: auto length = source_.elapsedUSecs (); source_.stop (); qtout << QString {"%1 μs recorded "}.arg (length) << '(' << source_.format ().framesForBytes (output_->size ()) << " frames recorded)\n"; - qtout << "stopped recording at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; + qtout << "stopped recording at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; Q_EMIT done (); } @@ -134,15 +158,33 @@ public: private: Q_SLOT void start_playback () { - qtout << "started playback at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; + qtout << "started playback at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; sink_.start (input_); - qtout << QString {"buffer size used is: %1 (%2 frames)"}.arg (sink_.bufferSize ()).arg (sink_.format ().framesForBytes (sink_.bufferSize ())) << endl; + qtout << QString {"buffer size used is: %1 (%2 frames)"}.arg (sink_.bufferSize ()).arg (sink_.format ().framesForBytes (sink_.bufferSize ())) +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; } Q_SLOT void notify () { auto length = sink_.elapsedUSecs (); - qtout << QString {"%1 μs rendered\r"}.arg (length) << flush; + qtout << QString {"%1 μs rendered\r"}.arg (length) << +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + Qt::flush +#else + flush +#endif + ; } Q_SLOT void sink_state_changed (QAudio::State state) @@ -175,7 +217,13 @@ private: auto length = sink_.elapsedUSecs (); sink_.stop (); qtout << QString {"%1 μs rendered "}.arg (length) << '(' << sink_.format ().framesForBytes (input_->size ()) << " frames rendered)\n"; - qtout << "stopped playback at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") << endl; + qtout << "stopped playback at " << QDateTime::currentDateTimeUtc ().toString ("hh:mm:ss.zzz UTC") +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; Q_EMIT done (); } @@ -258,7 +306,13 @@ int main(int argc, char *argv[]) int n {0}; for (auto const& device : input_devices) { - qtout << ++n << " - [" << device.deviceName () << ']' << endl; + qtout << ++n << " - [" << device.deviceName () << ']' +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; } return 0; } @@ -269,7 +323,13 @@ int main(int argc, char *argv[]) int n {0}; for (auto const& device : output_devices) { - qtout << ++n << " - [" << device.deviceName () << ']' << endl; + qtout << ++n << " - [" << device.deviceName () << ']' +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; } return 0; } @@ -352,7 +412,13 @@ int main(int argc, char *argv[]) auto source = input_device ? input_devices[input_device - 1] : QAudioDeviceInfo::defaultInputDevice (); if (!source.isFormatSupported (audio_format)) { - qtout << "warning, requested format not supported, using nearest" << endl; + qtout << "warning, requested format not supported, using nearest" +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; audio_format = source.nearestFormat (audio_format); } BWFFile output_file {audio_format, ofi.filePath ()}; diff --git a/CMakeLists.txt b/CMakeLists.txt index 3dbdb82e2..743558619 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -887,7 +887,7 @@ message (STATUS "hamlib_LIBRARY_DIRS: ${hamlib_LIBRARY_DIRS}") # # Widgets finds its own dependencies. -find_package (Qt5 COMPONENTS Widgets Multimedia PrintSupport Sql LinguistTools REQUIRED) +find_package (Qt5 COMPONENTS Widgets SerialPort Multimedia PrintSupport Sql LinguistTools REQUIRED) if (WIN32) add_definitions (-DQT_NEEDS_QTMAIN) @@ -1378,9 +1378,9 @@ set_target_properties (wsjtx PROPERTIES target_include_directories (wsjtx PRIVATE ${FFTW3_INCLUDE_DIRS}) if (APPLE) - target_link_libraries (wsjtx wsjt_fort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) + target_link_libraries (wsjtx Qt5::SerialPort wsjt_fort wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) else () - target_link_libraries (wsjtx wsjt_fort_omp wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) + target_link_libraries (wsjtx Qt5::SerialPort wsjt_fort_omp wsjt_cxx wsjt_qt wsjt_qtmm ${hamlib_LIBRARIES} ${FFTW3_LIBRARIES}) if (OpenMP_C_FLAGS) set_target_properties (wsjtx PROPERTIES COMPILE_FLAGS "${OpenMP_C_FLAGS}" @@ -1396,7 +1396,6 @@ else () ) endif () endif () -qt5_use_modules (wsjtx SerialPort) # not sure why the interface link library syntax above doesn't work # make a library for WSJT-X UDP servers # add_library (wsjtx_udp SHARED ${UDP_library_CXXSRCS}) @@ -1416,8 +1415,7 @@ set_target_properties (wsjtx_udp-static PROPERTIES OUTPUT_NAME wsjtx_udp ) target_compile_definitions (wsjtx_udp-static PUBLIC UDP_STATIC_DEFINE) -#qt5_use_modules (wsjtx_udp Network) -qt5_use_modules (wsjtx_udp-static Network Gui) +target_link_libraries (wsjtx_udp-static Qt5::Network Qt5::Gui) generate_export_header (wsjtx_udp-static BASE_NAME udp) add_executable (udp_daemon UDPExamples/UDPDaemon.cpp UDPExamples/udp_daemon.rc ${WSJTX_ICON_FILE}) diff --git a/Decoder/decodedtext.cpp b/Decoder/decodedtext.cpp index 7d5a57e84..6e2f359e4 100644 --- a/Decoder/decodedtext.cpp +++ b/Decoder/decodedtext.cpp @@ -3,6 +3,7 @@ #include #include #include +#include "qt_helpers.hpp" extern "C" { bool stdmsg_(char const * msg, fortran_charlen_t); @@ -58,7 +59,7 @@ QStringList DecodedText::messageWords () const return words_re.match(t).capturedTexts(); } // simple word split for free text messages - auto words = message_.split (' ', QString::SkipEmptyParts); + auto words = message_.split (' ', SkipEmptyParts); // add whole message as item 0 to mimic RE capture list words.prepend (message_); return words; @@ -122,7 +123,7 @@ bool DecodedText::report(QString const& myBaseCall, QString const& dxBaseCall, / { if (message_.size () < 1) return false; - QStringList const& w = message_.split(" ",QString::SkipEmptyParts); + QStringList const& w = message_.split(" ", Qt::SkipEmptyParts); if (w.size () && is_standard_ && (w[0] == myBaseCall || w[0].endsWith ("/" + myBaseCall) diff --git a/DisplayManual.cpp b/DisplayManual.cpp index 155c22006..c5b9021b4 100644 --- a/DisplayManual.cpp +++ b/DisplayManual.cpp @@ -49,10 +49,12 @@ public: void display (QUrl const& url, QString const& name_we) { +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) if (QNetworkAccessManager::Accessible != qnam_->networkAccessible ()) { // try and recover network access for QNAM qnam_->setNetworkAccessible (QNetworkAccessManager::Accessible); } +#endif // try and find a localized manual auto lang = QLocale::system ().name (); diff --git a/Modulator/Modulator.cpp b/Modulator/Modulator.cpp index ca9942e98..e527ce3e1 100644 --- a/Modulator/Modulator.cpp +++ b/Modulator/Modulator.cpp @@ -2,6 +2,9 @@ #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) +#include +#endif #include #include "widgets/mainwindow.h" // TODO: G4WJS - break this dependency #include "Audio/soundout.h" @@ -278,8 +281,13 @@ qint64 Modulator::readData (char * data, qint64 maxSize) int j=m_ic/480; if(m_fSpread>0.0 and j!=m_j0) { +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + float x1=QRandomGenerator::global ()->generateDouble (); + float x2=QRandomGenerator::global ()->generateDouble (); +#else float x1=(float)qrand()/RAND_MAX; float x2=(float)qrand()/RAND_MAX; +#endif toneFrequency = m_toneFrequency0 + 0.5*m_fSpread*(x1+x2-1.0); m_dphi = m_twoPi * toneFrequency / m_frameRate; m_j0=j; diff --git a/Network/LotWUsers.cpp b/Network/LotWUsers.cpp index fd1b5746c..4e8024010 100644 --- a/Network/LotWUsers.cpp +++ b/Network/LotWUsers.cpp @@ -69,11 +69,13 @@ public: void download (QUrl url) { +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) if (QNetworkAccessManager::Accessible != network_manager_->networkAccessible ()) { // try and recover network access for QNAM network_manager_->setNetworkAccessible (QNetworkAccessManager::Accessible); } +#endif QNetworkRequest request {url}; request.setRawHeader ("User-Agent", "WSJT LotW User Downloader"); diff --git a/Network/MessageClient.cpp b/Network/MessageClient.cpp index ddf269564..d33b2a636 100644 --- a/Network/MessageClient.cpp +++ b/Network/MessageClient.cpp @@ -423,6 +423,7 @@ MessageClient::MessageClient (QString const& id, QString const& version, QString : QObject {self} , m_ {id, version, revision, server_port, this} { +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) connect (&*m_, static_cast (&impl::error) , [this] (impl::SocketError e) { @@ -441,6 +442,11 @@ MessageClient::MessageClient (QString const& id, QString const& version, QString Q_EMIT error (m_->errorString ()); } }); +#else + connect (&*m_, &impl::errorOccurred, [this] (impl::SocketError) { + Q_EMIT error (m_->errorString ()); + }); +#endif set_server (server); } diff --git a/Network/psk_reporter.cpp b/Network/psk_reporter.cpp index e84b5a921..f84da5ecd 100644 --- a/Network/psk_reporter.cpp +++ b/Network/psk_reporter.cpp @@ -7,6 +7,9 @@ #include #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) +#include +#endif #include "Network/MessageClient.hpp" @@ -43,7 +46,11 @@ PSK_Reporter::PSK_Reporter(MessageClient * message_client, QObject *parent) : "00960004"; // Report time +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) m_randomId_h = QString("%1").arg(qrand(),8,16,QChar('0')); +#else + m_randomId_h = QString("%1").arg(QRandomGenerator::global ()->generate (), 8, 16, QChar('0')); +#endif QHostInfo::lookupHost("report.pskreporter.info", this, SLOT(dnsLookupResult(QHostInfo))); diff --git a/Network/wsprnet.cpp b/Network/wsprnet.cpp index 9e666088b..cdfed7683 100644 --- a/Network/wsprnet.cpp +++ b/Network/wsprnet.cpp @@ -208,10 +208,12 @@ QString WSPRNet::urlEncodeSpot(QHash const& query) void WSPRNet::work() { if (!urlQueue.isEmpty()) { +#if QT_VERSION < QT_VERSION_CHECK (5, 15, 0) if (QNetworkAccessManager::Accessible != networkManager->networkAccessible ()) { // try and recover network access for QNAM networkManager->setNetworkAccessible (QNetworkAccessManager::Accessible); } +#endif QUrl url(urlQueue.dequeue()); QNetworkRequest request(url); m_outstandingRequests << networkManager->get(request); diff --git a/SampleDownloader/RemoteFile.cpp b/SampleDownloader/RemoteFile.cpp index e5b4d2cd9..72d1ddbd4 100644 --- a/SampleDownloader/RemoteFile.cpp +++ b/SampleDownloader/RemoteFile.cpp @@ -121,10 +121,12 @@ bool RemoteFile::sync (QUrl const& url, bool local, bool force) void RemoteFile::download (QUrl url) { +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) if (QNetworkAccessManager::Accessible != network_manager_->networkAccessible ()) { // try and recover network access for QNAM network_manager_->setNetworkAccessible (QNetworkAccessManager::Accessible); } +#endif if (url.isValid () && (!QSslSocket::supportsSsl () || http_only_)) { diff --git a/TraceFile.cpp b/TraceFile.cpp index 87d4a82bb..22284d9b1 100644 --- a/TraceFile.cpp +++ b/TraceFile.cpp @@ -78,7 +78,12 @@ void TraceFile::impl::message_handler (QtMsgType type, QMessageLogContext const& Q_ASSERT_X (current_stream_, "TraceFile:message_handler", "no stream to write to"); { QMutexLocker lock {&mutex_}; // thread safety - serialize writes to the trace file - *current_stream_ << qFormatLogMessage (type, context, msg) << endl; + *current_stream_ << qFormatLogMessage (type, context, msg) << +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + endl; +#else + Qt::endl; +#endif } if (QtFatalMsg == type) diff --git a/Transceiver/HRDTransceiver.cpp b/Transceiver/HRDTransceiver.cpp index d471a5100..e81128b9c 100644 --- a/Transceiver/HRDTransceiver.cpp +++ b/Transceiver/HRDTransceiver.cpp @@ -10,6 +10,7 @@ #include #include "Network/NetworkServerLookup.hpp" +#include "qt_helpers.hpp" namespace { @@ -167,7 +168,7 @@ int HRDTransceiver::do_start () HRD_info << "Id: " << id << "\n"; HRD_info << "Version: " << version << "\n"; - auto radios = send_command ("get radios", false, false).trimmed ().split (',', QString::SkipEmptyParts); + auto radios = send_command ("get radios", false, false).trimmed ().split (',', Qt::SkipEmptyParts); if (radios.isEmpty ()) { TRACE_CAT ("HRDTransceiver", "no rig found"); @@ -178,7 +179,7 @@ int HRDTransceiver::do_start () Q_FOREACH (auto const& radio, radios) { HRD_info << "\t" << radio << "\n"; - auto entries = radio.trimmed ().split (':', QString::SkipEmptyParts); + auto entries = radio.trimmed ().split (':', Qt::SkipEmptyParts); radios_.push_back (std::forward_as_tuple (entries[0].toUInt (), entries[1])); } @@ -202,11 +203,11 @@ int HRDTransceiver::do_start () HRD_info << "VFO count: " << vfo_count_ << "\n"; TRACE_CAT ("HRDTransceiver", "vfo count:" << vfo_count_); - buttons_ = send_command ("get buttons").trimmed ().split (',', QString::SkipEmptyParts).replaceInStrings (" ", "~"); + buttons_ = send_command ("get buttons").trimmed ().split (',', Qt::SkipEmptyParts).replaceInStrings (" ", "~"); TRACE_CAT ("HRDTransceiver", "HRD Buttons: " << buttons_); HRD_info << "Buttons: {" << buttons_.join (", ") << "}\n"; - dropdown_names_ = send_command ("get dropdowns").trimmed ().split (',', QString::SkipEmptyParts); + dropdown_names_ = send_command ("get dropdowns").trimmed ().split (',', Qt::SkipEmptyParts); TRACE_CAT ("HRDTransceiver", "Dropdowns:"); HRD_info << "Dropdowns:\n"; Q_FOREACH (auto const& dd, dropdown_names_) @@ -217,12 +218,12 @@ int HRDTransceiver::do_start () dropdowns_[dd] = selections; } - slider_names_ = send_command ("get sliders").trimmed ().split (',', QString::SkipEmptyParts).replaceInStrings (" ", "~"); + slider_names_ = send_command ("get sliders").trimmed ().split (',', Qt::SkipEmptyParts).replaceInStrings (" ", "~"); TRACE_CAT ("HRDTransceiver", "Sliders:-"); HRD_info << "Sliders:\n"; Q_FOREACH (auto const& s, slider_names_) { - auto range = send_command ("get slider-range " + current_radio_name + " " + s).trimmed ().split (',', QString::SkipEmptyParts); + auto range = send_command ("get slider-range " + current_radio_name + " " + s).trimmed ().split (',', Qt::SkipEmptyParts); TRACE_CAT ("HRDTransceiver", "\t" << s << ": {" << range.join (", ") << "}"); HRD_info << "\t" << s << ": {" << range.join (", ") << "}\n"; sliders_[s] = range; @@ -601,7 +602,7 @@ void HRDTransceiver::do_frequency (Frequency f, MODE m, bool /*no_ignore*/) auto fo_string = QString::number (f); if (vfo_count_ > 1 && reversed_) { - auto frequencies = send_command ("get frequencies").trimmed ().split ('-', QString::SkipEmptyParts); + auto frequencies = send_command ("get frequencies").trimmed ().split ('-', Qt::SkipEmptyParts); send_simple_command ("set frequencies-hz " + QString::number (frequencies[0].toUInt ()) + ' ' + fo_string); } else @@ -687,14 +688,14 @@ void HRDTransceiver::do_tx_frequency (Frequency tx, MODE mode, bool /*no_ignore* { Q_ASSERT (vfo_count_ > 1); - auto frequencies = send_command ("get frequencies").trimmed ().split ('-', QString::SkipEmptyParts); + auto frequencies = send_command ("get frequencies").trimmed ().split ('-', Qt::SkipEmptyParts); send_simple_command ("set frequencies-hz " + fo_string + ' ' + QString::number (frequencies[1].toUInt ())); } else { if (vfo_count_ > 1) { - auto frequencies = send_command ("get frequencies").trimmed ().split ('-', QString::SkipEmptyParts); + auto frequencies = send_command ("get frequencies").trimmed ().split ('-', Qt::SkipEmptyParts); send_simple_command ("set frequencies-hz " + QString::number (frequencies[0].toUInt ()) + ' ' + fo_string); } else if ((vfo_B_button_ >= 0 && vfo_A_button_ >= 0) || vfo_toggle_button_ >= 0) @@ -986,7 +987,7 @@ void HRDTransceiver::do_poll () if (vfo_count_ > 1) { - auto frequencies = send_command ("get frequencies", quiet).trimmed ().split ('-', QString::SkipEmptyParts); + auto frequencies = send_command ("get frequencies", quiet).trimmed ().split ('-', Qt::SkipEmptyParts); update_rx_frequency (frequencies[reversed_ ? 1 : 0].toUInt ()); update_other_frequency (frequencies[reversed_ ? 0 : 1].toUInt ()); } diff --git a/UDPExamples/MessageServer.cpp b/UDPExamples/MessageServer.cpp index ce7cd6fb9..59907d521 100644 --- a/UDPExamples/MessageServer.cpp +++ b/UDPExamples/MessageServer.cpp @@ -39,11 +39,18 @@ public: Radio::register_types (); connect (this, &QIODevice::readyRead, this, &MessageServer::impl::pending_datagrams); +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) connect (this, static_cast (&impl::error) , [this] (SocketError /* e */) { Q_EMIT self_->error (errorString ()); }); +#else + connect (this, &impl::errorOccurred, [this] (SocketError /* e */) + { + Q_EMIT self_->error (errorString ()); + }); +#endif connect (clock_, &QTimer::timeout, this, &impl::tick); clock_->start (NetworkMessage::pulse * 1000); } diff --git a/WFPalette.cpp b/WFPalette.cpp index 1dd65fd24..d7d8a5e64 100644 --- a/WFPalette.cpp +++ b/WFPalette.cpp @@ -242,7 +242,13 @@ namespace QTextStream stream {&file}; Q_FOREACH (auto colour, colours_) { - stream << colour.red () << ';' << colour.green () << ';' << colour.blue () << endl; + stream << colour.red () << ';' << colour.green () << ';' << colour.blue () << +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + endl +#else + Qt::endl +#endif + ; } } else diff --git a/getfile.cpp b/getfile.cpp index b59a094a7..8cc6cedc2 100644 --- a/getfile.cpp +++ b/getfile.cpp @@ -1,5 +1,9 @@ #include "getfile.h" #include +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) +#include +#include +#endif #include #include #include @@ -171,6 +175,10 @@ void savewav(QString fname, int ntrperiod) /* Generate gaussian random float with mean=0 and std_dev=1 */ float gran() { +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + static std::normal_distribution d; + return d (*QRandomGenerator::global ()); +#else float fac,rsq,v1,v2; static float gset; static int iset; @@ -192,6 +200,7 @@ float gran() gset = v1*fac; iset++; return v2*fac; +#endif } int ptt(int nport, int ntx, int* iptt, int* nopen) diff --git a/killbyname.cpp b/killbyname.cpp index 3fe8841e2..d5a664aaa 100644 --- a/killbyname.cpp +++ b/killbyname.cpp @@ -84,12 +84,12 @@ int killbyname(const char *szToTerminate) if(hInstLib == NULL) return 605; // Get procedure addresses. - lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*)) + lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))(void (*)()) GetProcAddress( hInstLib, "EnumProcesses" ) ; lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *, - DWORD, LPDWORD)) GetProcAddress( hInstLib, "EnumProcessModules" ) ; + DWORD, LPDWORD))(void (*)()) GetProcAddress( hInstLib, "EnumProcessModules" ) ; lpfGetModuleBaseName =(DWORD (WINAPI *)(HANDLE, HMODULE, LPTSTR, - DWORD )) GetProcAddress( hInstLib, "GetModuleBaseNameA" ) ; + DWORD ))(void (*)()) GetProcAddress( hInstLib, "GetModuleBaseNameA" ) ; if(lpfEnumProcesses == NULL || lpfEnumProcessModules == NULL || lpfGetModuleBaseName == NULL) { @@ -164,20 +164,20 @@ int killbyname(const char *szToTerminate) // which does not have the Toolhelp32 // functions in the Kernel 32. lpfCreateToolhelp32Snapshot= - (HANDLE(WINAPI *)(DWORD,DWORD)) + (HANDLE(WINAPI *)(DWORD,DWORD))(void (*)()) GetProcAddress( hInstLib, "CreateToolhelp32Snapshot" ) ; lpfProcess32First= - (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32)) + (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))(void (*)()) GetProcAddress( hInstLib, "Process32First" ) ; lpfProcess32Next= - (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32)) + (BOOL(WINAPI *)(HANDLE,LPPROCESSENTRY32))(void (*)()) GetProcAddress( hInstLib, "Process32Next" ) ; lpfModule32First= - (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32)) + (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))(void (*)()) GetProcAddress( hInstLib, "Module32First" ) ; lpfModule32Next= - (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32)) + (BOOL(WINAPI *)(HANDLE,LPMODULEENTRY32))(void (*)()) GetProcAddress( hInstLib, "Module32Next" ) ; if( lpfProcess32Next == NULL || lpfProcess32First == NULL || diff --git a/logbook/WorkedBefore.cpp b/logbook/WorkedBefore.cpp index a1d774e4e..438243d42 100644 --- a/logbook/WorkedBefore.cpp +++ b/logbook/WorkedBefore.cpp @@ -442,9 +442,21 @@ bool WorkedBefore::add (QString const& call QTextStream out {&file}; if (!file.size ()) { - out << "WSJT-X ADIF Export" << endl; // new file + out << "WSJT-X ADIF Export" << // new file +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + endl +#else + Qt::endl +#endif + ; } - out << ADIF_record << " " << endl; + out << ADIF_record << " " << +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + endl +#else + Qt::endl +#endif + ; } m_->worked_.emplace (call.toUpper (), grid.left (4).toUpper (), band.toUpper (), mode.toUpper () , entity.entity_name, entity.continent, entity.CQ_zone, entity.ITU_zone); diff --git a/logbook/logbook.cpp b/logbook/logbook.cpp index 96a8cb8e3..316901f9d 100644 --- a/logbook/logbook.cpp +++ b/logbook/logbook.cpp @@ -103,7 +103,13 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q if(operator_call!="") t+=" " + operator_call; if (xSent.size ()) { - auto words = xSent.split (' ', QString::SkipEmptyParts); + auto words = xSent.split (' ' +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + , QString::SkipEmptyParts +#else + , Qt::SkipEmptyParts +#endif + ); if (words.size () > 1) { if (words.back ().toUInt ()) @@ -126,7 +132,13 @@ QByteArray LogBook::QSOToADIF (QString const& hisCall, QString const& hisGrid, Q } } if (xRcvd.size ()) { - auto words = xRcvd.split (' ', QString::SkipEmptyParts); + auto words = xRcvd.split (' ' +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + , QString::SkipEmptyParts +#else + , Qt::SkipEmptyParts +#endif + ); if (words.size () == 2) { if (words.at (1).toUInt ()) diff --git a/main.cpp b/main.cpp index bce897adf..4943f2f02 100644 --- a/main.cpp +++ b/main.cpp @@ -49,6 +49,7 @@ extern "C" { namespace { +#if QT_VERSION < QT_VERSION_CHECK (5, 15, 0) struct RNGSetup { RNGSetup () @@ -58,6 +59,7 @@ namespace qsrand (seed); // this is good for rand() as well } } seeding; +#endif // We can't use the GUI after QApplication::exit() is called so // uncaught exceptions can get lost on Windows systems where there diff --git a/models/FoxLog.cpp b/models/FoxLog.cpp index 3ba7d2c23..01ce0c409 100644 --- a/models/FoxLog.cpp +++ b/models/FoxLog.cpp @@ -274,5 +274,9 @@ void FoxLog::export_qsos (QTextStream& out) const << ADIF_field {"operator", m_->configuration_->opCall ()} << ""; } +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) out << endl; +#else + out << Qt::endl; +#endif } diff --git a/qcustomplot-source/qcustomplot.cpp b/qcustomplot-source/qcustomplot.cpp index d51ccde7a..375fc57aa 100644 --- a/qcustomplot-source/qcustomplot.cpp +++ b/qcustomplot-source/qcustomplot.cpp @@ -4766,7 +4766,7 @@ Qt::Alignment QCPLayoutInset::insetAlignment(int index) const else { qDebug() << Q_FUNC_INFO << "Invalid element index:" << index; - return 0; + return Qt::Alignment {}; } } @@ -6013,11 +6013,13 @@ double QCPAxisTickerDateTime::dateTimeToKey(const QDateTime dateTime) */ double QCPAxisTickerDateTime::dateTimeToKey(const QDate date) { -# if QT_VERSION < QT_VERSION_CHECK(4, 7, 0) +#if QT_VERSION < QT_VERSION_CHECK(4, 7, 0) return QDateTime(date).toTime_t(); -# else +#elif QT_VERSION < QT_VERSION_CHECK(5, 14, 0) return QDateTime(date).toMSecsSinceEpoch()/1000.0; -# endif +#else + return date.startOfDay().toMSecsSinceEpoch()/1000.0; +#endif } /* end of 'src/axis/axistickerdatetime.cpp' */ @@ -6499,7 +6501,11 @@ void QCPAxisTickerText::addTick(double position, QString label) */ void QCPAxisTickerText::addTicks(const QMap &ticks) { +# if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) mTicks.unite(ticks); +#else + mTicks.insert(ticks); +#endif } /*! \overload @@ -12598,9 +12604,11 @@ QCustomPlot::QCustomPlot(QWidget *parent) : mBufferDevicePixelRatio(1.0), // will be adapted to primary screen below mPlotLayout(0), mAutoAddPlottableToLegend(true), +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) mAntialiasedElements(QCP::aeNone), mNotAntialiasedElements(QCP::aeNone), mInteractions(0), +#endif mSelectionTolerance(8), mNoAntialiasingOnDrag(false), mBackgroundBrush(Qt::white, Qt::SolidPattern), @@ -12617,7 +12625,9 @@ QCustomPlot::QCustomPlot(QWidget *parent) : mReplotting(false), mReplotQueued(false), mOpenGlMultisamples(16), +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) mOpenGlAntialiasedElementsBackup(QCP::aeNone), +#endif mOpenGlCacheLabelsBackup(true) { setAttribute(Qt::WA_NoMousePropagation); @@ -14668,7 +14678,15 @@ void QCustomPlot::wheelEvent(QWheelEvent *event) { emit mouseWheel(event); // forward event to layerable under cursor: - QList candidates = layerableListAt(event->pos(), false); + QList candidates = layerableListAt( +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) + event->pos() +#elif QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + event->posF() +#else + event->position() +#endif + , false); for (int i=0; iaccept(); // default impl of QCPLayerable's mouse events ignore the event, in that case propagate to next candidate in list @@ -15002,7 +15020,7 @@ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) if (mInteractions.testFlag(QCP::iSelectPlottables)) { - QMap > potentialSelections; // map key is number of selected data points, so we have selections sorted by size + QMultiMap > potentialSelections; // map key is number of selected data points, so we have selections sorted by size QRectF rectF(rect.normalized()); if (QCPAxisRect *affectedAxisRect = axisRectAt(rectF.topLeft())) { @@ -15013,7 +15031,7 @@ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) { QCPDataSelection dataSel = plottableInterface->selectTestRect(rectF, true); if (!dataSel.isEmpty()) - potentialSelections.insertMulti(dataSel.dataPointCount(), QPair(plottable, dataSel)); + potentialSelections.insert(dataSel.dataPointCount(), QPair(plottable, dataSel)); } } @@ -15022,7 +15040,7 @@ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) // only leave plottable with most selected points in map, since we will only select a single plottable: if (!potentialSelections.isEmpty()) { - QMap >::iterator it = potentialSelections.begin(); + QMultiMap >::iterator it = potentialSelections.begin(); while (it != potentialSelections.end()-1) // erase all except last element it = potentialSelections.erase(it); } @@ -15048,7 +15066,7 @@ void QCustomPlot::processRectSelection(QRect rect, QMouseEvent *event) } // go through selections in reverse (largest selection first) and emit select events: - QMap >::const_iterator it = potentialSelections.constEnd(); + QMultiMap >::const_iterator it = potentialSelections.constEnd(); while (it != potentialSelections.constBegin()) { --it; @@ -17619,14 +17637,24 @@ void QCPAxisRect::wheelEvent(QWheelEvent *event) if (mRangeZoom != 0) { double factor; +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) double wheelSteps = event->delta()/120.0; // a single step delta is +/-120 usually +#else + double wheelSteps = event->angleDelta().y()/120.0; // a single step delta is +/-120 usually +#endif if (mRangeZoom.testFlag(Qt::Horizontal)) { factor = qPow(mRangeZoomFactorHorz, wheelSteps); for (int i=0; iscaleRange(factor, mRangeZoomHorzAxis.at(i)->pixelToCoord(event->pos().x())); + mRangeZoomHorzAxis.at(i)->scaleRange(factor, mRangeZoomHorzAxis.at(i)->pixelToCoord( +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + event->posF().x() +#else + event->position().x() +#endif + )); } } if (mRangeZoom.testFlag(Qt::Vertical)) @@ -17635,7 +17663,13 @@ void QCPAxisRect::wheelEvent(QWheelEvent *event) for (int i=0; iscaleRange(factor, mRangeZoomVertAxis.at(i)->pixelToCoord(event->pos().y())); + mRangeZoomVertAxis.at(i)->scaleRange(factor, mRangeZoomVertAxis.at(i)->pixelToCoord( +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + event->posF().y() +#else + event->position().y() +#endif + )); } } mParentPlot->replot(); @@ -19262,7 +19296,7 @@ void QCPColorScale::setRangeDrag(bool enabled) if (enabled) mAxisRect.data()->setRangeDrag(QCPAxis::orientation(mType)); else - mAxisRect.data()->setRangeDrag(0); + mAxisRect.data()->setRangeDrag(Qt::Orientations()); } /*! @@ -19282,7 +19316,7 @@ void QCPColorScale::setRangeZoom(bool enabled) if (enabled) mAxisRect.data()->setRangeZoom(QCPAxis::orientation(mType)); else - mAxisRect.data()->setRangeZoom(0); + mAxisRect.data()->setRangeZoom(Qt::Orientations()); } /*! diff --git a/qt_helpers.hpp b/qt_helpers.hpp index bdb7cc935..33f501437 100644 --- a/qt_helpers.hpp +++ b/qt_helpers.hpp @@ -51,6 +51,12 @@ return QString {mo.enumerator (mo.indexOfEnumerator (#ENUM)).valueToKey (static_cast (m))}; \ } +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) +Qt::SplitBehaviorFlags const SkipEmptyParts = Qt::SkipEmptyParts; +#else +QString::SplitBehavior const SkipEmptyParts = QString::SkipEmptyParts; +#endif + inline void throw_qstring (QString const& qs) { diff --git a/widgets/ExportCabrillo.cpp b/widgets/ExportCabrillo.cpp index 5fb54c7dc..9a20d7568 100644 --- a/widgets/ExportCabrillo.cpp +++ b/widgets/ExportCabrillo.cpp @@ -99,7 +99,13 @@ void ExportCabrillo::save_log () << "ADDRESS: " << ui->addr_1_line_edit->text() << '\n' << "ADDRESS: " << ui->addr_2_line_edit->text() << '\n'; if (log_) log_->export_qsos (out); - out << "END-OF-LOG:" << endl; + out << "END-OF-LOG:" +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; return; } else { auto const& message = tr ("Cannot open \"%1\" for writing: %2") diff --git a/widgets/astro.cpp b/widgets/astro.cpp index 8c083a89a..122b86eff 100644 --- a/widgets/astro.cpp +++ b/widgets/astro.cpp @@ -131,7 +131,11 @@ auto Astro::astroUpdate(QDateTime const& t, QString const& mygrid, QString const QTextStream out {&message}; out << " " << date << "\n" "UTC: " << utc << "\n" +#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) + << Qt::fixed +#else << fixed +#endif << qSetFieldWidth (6) << qSetRealNumberPrecision (1) << "Az: " << azmoon << "\n" diff --git a/widgets/logqso.cpp b/widgets/logqso.cpp index c79133677..187d2618c 100644 --- a/widgets/logqso.cpp +++ b/widgets/logqso.cpp @@ -142,8 +142,20 @@ void LogQSO::accept() } if ((special_op == SpOp::RTTY and xsent!="" and xrcvd!="")) { - if(rptSent=="" or !xsent.contains(rptSent+" ")) rptSent=xsent.split(" ",QString::SkipEmptyParts).at(0); - if(rptRcvd=="" or !xrcvd.contains(rptRcvd+" ")) rptRcvd=xrcvd.split(" ",QString::SkipEmptyParts).at(0); + if(rptSent=="" or !xsent.contains(rptSent+" ")) rptSent=xsent.split(" " +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + , QString::SkipEmptyParts +#else + , Qt::SkipEmptyParts +#endif + ).at(0); + if(rptRcvd=="" or !xrcvd.contains(rptRcvd+" ")) rptRcvd=xrcvd.split(" " +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + , QString::SkipEmptyParts +#else + , Qt::SkipEmptyParts +#endif + ).at(0); } // validate @@ -181,7 +193,13 @@ void LogQSO::accept() "," + rptSent + "," + rptRcvd + "," + m_txPower + "," + m_comments + "," + name; QTextStream out(&f); - out << logEntry << endl; + out << logEntry << +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + endl +#else + Qt::endl +#endif + ; f.close(); } diff --git a/widgets/mainwindow.cpp b/widgets/mainwindow.cpp index a6ab9c8c2..0ed391faa 100644 --- a/widgets/mainwindow.cpp +++ b/widgets/mainwindow.cpp @@ -39,6 +39,9 @@ #include #include #include +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) +#include +#endif #include "revision_utils.hpp" #include "qt_helpers.hpp" @@ -84,7 +87,6 @@ #include "ui_mainwindow.h" #include "moc_mainwindow.cpp" - extern "C" { //----------------------------------------------------- C and Fortran routines void symspec_(struct dec_data *, int* k, int* ntrperiod, int* nsps, int* ingain, @@ -654,16 +656,17 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, subProcessError (&proc_jt9, error); }); #else - connect(&proc_jt9, static_cast (&QProcess::errorOccurred), - [this] (QProcess::ProcessError error) { - subProcessError (&proc_jt9, error); - }); + connect(&proc_jt9, &QProcess::errorOccurred, [this] (QProcess::ProcessError error) { + subProcessError (&proc_jt9, error); + }); #endif connect(&proc_jt9, static_cast (&QProcess::finished), [this] (int exitCode, QProcess::ExitStatus status) { subProcessFailed (&proc_jt9, exitCode, status); }); - + connect(&p1, &QProcess::started, [this] () { + showStatusMessage (QString {"Started: %1 \"%2\""}.arg (p1.program ()).arg (p1.arguments ().join (QLatin1String {"\" \""}))); + }); connect(&p1, &QProcess::readyReadStandardOutput, this, &MainWindow::p1ReadFromStdout); #if QT_VERSION < QT_VERSION_CHECK (5, 6, 0) connect(&p1, static_cast (&QProcess::error), @@ -671,10 +674,9 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, subProcessError (&p1, error); }); #else - connect(&p1, static_cast (&QProcess::errorOccurred), - [this] (QProcess::ProcessError error) { - subProcessError (&p1, error); - }); + connect(&p1, &QProcess::errorOccurred, [this] (QProcess::ProcessError error) { + subProcessError (&p1, error); + }); #endif connect(&p1, static_cast (&QProcess::finished), [this] (int exitCode, QProcess::ExitStatus status) { @@ -687,11 +689,13 @@ MainWindow::MainWindow(QDir const& temp_directory, bool multiple, subProcessError (&p3, error); }); #else - connect(&p3, static_cast (&QProcess::errorOccurred), - [this] (QProcess::ProcessError error) { - subProcessError (&p3, error); - }); + connect(&p3, &QProcess::errorOccurred, [this] (QProcess::ProcessError error) { + subProcessError (&p3, error); + }); #endif + connect(&p3, &QProcess::started, [this] () { + showStatusMessage (QString {"Started: %1 \"%2\""}.arg (p3.program ()).arg (p3.arguments ().join (QLatin1String {"\" \""}))); + }); connect(&p3, static_cast (&QProcess::finished), [this] (int exitCode, QProcess::ExitStatus status) { subProcessFailed (&p3, exitCode, status); @@ -1400,7 +1404,13 @@ void MainWindow::dataSink(qint64 frames) QFile f {m_config.writeable_data_dir ().absoluteFilePath ("fmt.all")}; if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { QTextStream out(&f); - out << t << endl; + out << t +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; f.close(); } else { MessageBox::warning_message (this, tr ("File Open Error") @@ -1507,36 +1517,39 @@ void MainWindow::dataSink(qint64 frames) } if(m_mode.startsWith ("WSPR")) { - QString t2,cmnd,depth_string; - double f0m1500=m_dialFreqRxWSPR/1000000.0; // + 0.000001*(m_BFO - 1500); - t2 = t2.asprintf(" -f %.6f ",f0m1500); - if((m_ndepth&7)==1) depth_string=" -qB "; //2 pass w subtract, no Block detection, no shift jittering - if((m_ndepth&7)==2) depth_string=" -C 500 -o 4 "; //3 pass, subtract, Block detection, OSD - if((m_ndepth&7)==3) depth_string=" -C 500 -o 4 -d "; //3 pass, subtract, Block detect, OSD, more candidates - QString degrade; - degrade = degrade.asprintf("-d %4.1f ",m_config.degrade()); - + QStringList t2; + QStringList depth_args; + t2 << "-f" << QString {"%1"}.arg (m_dialFreqRxWSPR / 1000000.0, 0, 'f', 6); + if((m_ndepth&7)==1) depth_args << "-qB"; //2 pass w subtract, no Block detection, no shift jittering + if((m_ndepth&7)==2) depth_args << "-C" << "500" << "-o" << "4"; //3 pass, subtract, Block detection, OSD + if((m_ndepth&7)==3) depth_args << "-C" << "500" << "-o" << "4" << "-d"; //3 pass, subtract, Block detect, OSD, more candidates + QStringList degrade; + degrade << "-d" << QString {"%1"}.arg (m_config.degrade(), 4, 'f', 1); + m_cmndP1.clear (); if(m_diskData) { - cmnd='"' + m_appDir + '"' + "/wsprd " + depth_string + " -a \"" + - QDir::toNativeSeparators(m_config.writeable_data_dir ().absolutePath()) + "\" \"" + m_path + "\""; + m_cmndP1 << depth_args << "-a" + << QDir::toNativeSeparators (m_config.writeable_data_dir ().absolutePath()) << m_path; } else { - if(m_mode=="WSPR-LF") { -// cmnd='"' + m_appDir + '"' + "/wspr_fsk8d " + degrade + t2 +" -a \"" + -// QDir::toNativeSeparators(m_config.writeable_data_dir ().absolutePath()) + "\" " + -// '"' + m_fnameWE + ".wav\""; - } else { - cmnd='"' + m_appDir + '"' + "/wsprd " + depth_string + " -a \"" + - QDir::toNativeSeparators(m_config.writeable_data_dir ().absolutePath()) + "\" " + - t2 + '"' + m_fnameWE + ".wav\""; - } + // if(m_mode=="WSPR-LF") + // { + // m_cmndP1 << degrade << t2 << "-a" + // << QDir::toNativeSeparators (m_config.writeable_data_dir ().absolutePath()) + // << m_fnameWE + ".wav"; + // } + // else + { + m_cmndP1 << depth_args << "-a" + << QDir::toNativeSeparators (m_config.writeable_data_dir ().absolutePath()) + << t2 << m_fnameWE + ".wav"; + } } - QString t3=cmnd; - int i1=cmnd.indexOf("/wsprd "); - cmnd=t3.mid(0,i1+7) + t3.mid(i1+7); + // QString t3=cmnd; + // int i1=cmnd.indexOf("/wsprd "); + // cmnd=t3.mid(0,i1+7) + t3.mid(i1+7); // if(m_mode=="WSPR-LF") cmnd=cmnd.replace("/wsprd ","/wspr_fsk8d "+degrade+t2); if (ui) ui->DecodeButton->setChecked (true); - m_cmndP1=QDir::toNativeSeparators(cmnd); + // m_cmndP1=QDir::toNativeSeparators(cmnd); p1Timer.start(1000); m_decoderBusy = true; statusUpdate (); @@ -1547,7 +1560,14 @@ void MainWindow::dataSink(qint64 frames) void MainWindow::startP1() { - p1.start(m_cmndP1); + // if (m_mode=="WSPR-LF") + // { + // p1.start (QDir::toNativeSeparators (QDir {QApplication::applicationDirPath ()}.absoluteFilePath ("wspr_fsk8d")), m_cmndP1); + // } + // else + { + p1.start (QDir::toNativeSeparators (QDir {QApplication::applicationDirPath ()}.absoluteFilePath ("wsprd")), m_cmndP1); + } } QString MainWindow::save_wave_file (QString const& name, short const * data, int samples, @@ -2184,7 +2204,13 @@ void MainWindow::statusChanged() if (!tmpGrid.size ()) tmpGrid="n/a"; // Not Available out << qSetRealNumberPrecision (12) << (m_freqNominal / 1.e6) << ";" << m_mode << ";" << m_hisCall << ";" - << ui->rptSpinBox->value() << ";" << m_modeTx << ";" << tmpGrid << endl; + << ui->rptSpinBox->value() << ";" << m_modeTx << ";" << tmpGrid +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; f.close(); } else { if (m_splash && m_splash->isVisible ()) m_splash->hide (); @@ -2851,7 +2877,13 @@ void MainWindow::decode() //decode() if( m_dateTimeLastTX.isValid () ) { qint64 isecs_since_tx = m_dateTimeLastTX.secsTo(now); dec_data.params.lapcqonly= (isecs_since_tx > 300); -// QTextStream(stdout) << "last tx " << isecs_since_tx << endl; +// QTextStream(stdout) << "last tx " << isecs_since_tx +// #if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) +// << Qt::endl +// #else +// << endl +// #endif +// ; } else { m_dateTimeLastTX = now.addSecs(-900); dec_data.params.lapcqonly=true; @@ -3240,7 +3272,7 @@ void MainWindow::readFromStdout() //readFromStdout int audioFreq=decodedtext.frequencyOffset(); if(m_mode=="FT8" or m_mode=="FT4") { auto const& parts = decodedtext.string().remove("<").remove(">") - .split (' ', QString::SkipEmptyParts); + .split (' ', SkipEmptyParts); if (parts.size() > 6) { auto for_us = parts[5].contains (m_baseCall) || ("DE" == parts[5] && qAbs (ui->RxFreqSpinBox->value () - audioFreq) <= 10); @@ -3280,7 +3312,7 @@ void MainWindow::readFromStdout() //readFromStdout if(m_mode=="FT8" and SpecOp::HOUND==m_config.special_op_id()) { if(decodedtext.string().contains(";")) { - QStringList w=decodedtext.string().mid(24).split(" ",QString::SkipEmptyParts); + QStringList w=decodedtext.string().mid(24).split(" ",SkipEmptyParts); QString foxCall=w.at(3); foxCall=foxCall.remove("<").remove(">"); if(w.at(0)==m_config.my_callsign() or w.at(0)==Radio::base_callsign(m_config.my_callsign())) { @@ -3296,7 +3328,7 @@ void MainWindow::readFromStdout() //readFromStdout hound_reply (); } } else { - QStringList w=decodedtext.string().mid(24).split(" ",QString::SkipEmptyParts); + QStringList w=decodedtext.string().mid(24).split(" ",SkipEmptyParts); if(decodedtext.string().contains("/")) w.append(" +00"); //Add a dummy report if(w.size()>=3) { QString foxCall=w.at(1); @@ -3384,7 +3416,7 @@ void MainWindow::auto_sequence (DecodedText const& message, unsigned start_toler || message_words.contains ("DE"))) || !message.isStandardMessage ()); // free text 73/RR73 - QStringList w=message.string().mid(22).remove("<").remove(">").split(" ",QString::SkipEmptyParts); + QStringList w=message.string().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts); QString w2; int nrpt=0; if (w.size () > 2) @@ -3665,8 +3697,12 @@ void MainWindow::guiUpdate() else if (SpecOp::HOUND == m_config.special_op_id()) { if(m_auto && !m_tune) { if (ui->TxFreqSpinBox->value() < 999 && m_ntx != 3) { - int nf = (qrand() % 2000) + 1000; // Hound randomized range: 1000-3000 Hz - ui->TxFreqSpinBox->setValue(nf); + // Hound randomized range: 1000-3000 Hz +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + ui->TxFreqSpinBox->setValue (QRandomGenerator::global ()->bounded (1000, 2999)); +#else + ui->TxFreqSpinBox->setValue ((qrand () % 2000) + 1000); +#endif } } if (m_nSentFoxRrpt==2 and m_ntx==3) { @@ -3685,8 +3721,11 @@ void MainWindow::guiUpdate() // If HoldTxFreq is not checked, randomize Fox's Tx Freq // NB: Maybe this should be done no more than once every 5 minutes or so ? if(m_mode=="FT8" and SpecOp::FOX==m_config.special_op_id() and !ui->cbHoldTxFreq->isChecked()) { - int fTx = 300.0 + 300.0*double(qrand())/RAND_MAX; - ui->TxFreqSpinBox->setValue(fTx); +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + ui->TxFreqSpinBox->setValue (QRandomGenerator::global ()->bounded (300, 599)); +#else + ui->TxFreqSpinBox->setValue(300.0 + 300.0*double(qrand())/RAND_MAX); +#endif } setXIT (ui->TxFreqSpinBox->value ()); @@ -3858,7 +3897,7 @@ void MainWindow::guiUpdate() if(SpecOp::FIELD_DAY==m_config.special_op_id() or SpecOp::RTTY==m_config.special_op_id()) { if(m_ntx==2 or m_ntx==3) { - QStringList t=ui->tx2->text().split(' ', QString::SkipEmptyParts); + QStringList t=ui->tx2->text().split(' ', SkipEmptyParts); int n=t.size(); m_xSent=t.at(n-2) + " " + t.at(n-1); } @@ -3893,7 +3932,7 @@ void MainWindow::guiUpdate() auto t2 = QDateTime::currentDateTimeUtc ().toString ("hhmm"); icw[0] = 0; - auto msg_parts = m_currentMessage.split (' ', QString::SkipEmptyParts); + auto msg_parts = m_currentMessage.split (' ', SkipEmptyParts); if (msg_parts.size () > 2) { // clean up short code forms msg_parts[0].remove (QChar {'<'}); @@ -3904,7 +3943,7 @@ void MainWindow::guiUpdate() auto is_73 = m_QSOProgress >= ROGER_REPORT && message_is_73 (m_currentMessageType, msg_parts); m_sentFirst73 = is_73 - && !message_is_73 (m_lastMessageType, m_lastMessageSent.split (' ', QString::SkipEmptyParts)); + && !message_is_73 (m_lastMessageType, m_lastMessageSent.split (' ', SkipEmptyParts)); if (m_sentFirst73) { m_qsoStop=t2; if(m_config.id_after_73 ()) { @@ -4472,7 +4511,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie auto ctrl = modifiers.testFlag (Qt::ControlModifier); // auto alt = modifiers.testFlag (Qt::AltModifier); // basic mode sanity checks - auto const& parts = message.string ().split (' ', QString::SkipEmptyParts); + auto const& parts = message.string ().split (' ', SkipEmptyParts); if (parts.size () < 5) return; auto const& mode = parts.at (4).left (1); if (("JT9+JT65" == m_mode && !("@" == mode || "#" == mode)) @@ -4530,7 +4569,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie ui->dxCallEntry->setText(hiscall); } - QStringList w=message.string().mid(22).remove("<").remove(">").split(" ",QString::SkipEmptyParts); + QStringList w=message.string().mid(22).remove("<").remove(">").split(" ",SkipEmptyParts); int nw=w.size(); if(nw>=4) { if(message_words.size()<3) return; @@ -4622,7 +4661,7 @@ void MainWindow::processMessage (DecodedText const& message, Qt::KeyboardModifie MessageBox::information_message (this, msg); } - QStringList t=message.string().split(' ', QString::SkipEmptyParts); + QStringList t=message.string().split(' ', SkipEmptyParts); int n=t.size(); QString t0=t.at(n-2); QString t1=t0.right(1); @@ -5396,7 +5435,13 @@ void MainWindow::on_addButton_clicked() //Add button } if(f1.size()==0) { QTextStream out(&f1); - out << "ZZZZZZ" << endl; + out << "ZZZZZZ" +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; f1.close(); f1.open(QIODevice::ReadOnly | QIODevice::Text); } @@ -6975,7 +7020,13 @@ void MainWindow::handle_transceiver_update (Transceiver::TransceiverState const& QTextStream out(&f2); out << QDateTime::currentDateTimeUtc().toString("yyyy-MM-dd hh:mm") << " " << qSetRealNumberPrecision (12) << (m_freqNominal / 1.e6) << " MHz " - << m_mode << endl; + << m_mode +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; f2.close(); } else { MessageBox::warning_message (this, tr ("File Error") @@ -7553,7 +7604,7 @@ void MainWindow::replayDecodes () // appended info if (message.size() >= 4 && message.left (4) != "----") { - auto const& parts = message.split (' ', QString::SkipEmptyParts); + auto const& parts = message.split (' ', SkipEmptyParts); if (parts.size () >= 5 && parts[3].contains ('.')) // WSPR { postWSPRDecode (false, parts); @@ -7571,7 +7622,7 @@ void MainWindow::replayDecodes () void MainWindow::postDecode (bool is_new, QString const& message) { auto const& decode = message.trimmed (); - auto const& parts = decode.left (22).split (' ', QString::SkipEmptyParts); + auto const& parts = decode.left (22).split (' ', SkipEmptyParts); if (parts.size () >= 5) { auto has_seconds = parts[0].size () > 4; @@ -7644,9 +7695,11 @@ void MainWindow::p1ReadFromStdout() //p1readFromStdout ui->DecodeButton->setChecked (false); if(m_uploadSpots && m_config.is_transceiver_online ()) { // need working rig control - float x=qrand()/((double)RAND_MAX + 1.0); - int msdelay=20000*x; - uploadTimer.start(msdelay); //Upload delay +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + uploadTimer.start(QRandomGenerator::global ()->bounded (0, 20000)); // Upload delay +#else + uploadTimer.start(20000 * qrand()/((double)RAND_MAX + 1.0)); // Upload delay +#endif } else { QFile f(QDir::toNativeSeparators(m_config.writeable_data_dir ().absolutePath()) + "/wspr_spots.txt"); if(f.exists()) f.remove(); @@ -7746,7 +7799,13 @@ void MainWindow::WSPR_history(Frequency dialFreq, int ndecodes) QFile f {m_config.writeable_data_dir ().absoluteFilePath ("WSPR_history.txt")}; if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { QTextStream out(&f); - out << t1 << endl; + out << t1 +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; f.close(); } else { MessageBox::warning_message (this, tr ("File Error") @@ -7836,18 +7895,22 @@ void MainWindow::WSPR_scheduling () if (hop_data.frequencies_index_ >= 0) { // new band ui->bandComboBox->setCurrentIndex (hop_data.frequencies_index_); on_bandComboBox_activated (hop_data.frequencies_index_); - m_cmnd.clear (); QStringList prefixes {".bat", ".cmd", ".exe", ""}; + QString target; for (auto const& prefix : prefixes) { - auto const& path = m_appDir + "/user_hardware" + prefix; - QFile f {path}; - if (f.exists ()) { - m_cmnd = QDir::toNativeSeparators (f.fileName ()) + ' ' + - m_config.bands ()->find (m_freqNominal).remove ('m'); + target = QDir {m_appDir}.absoluteFilePath (QLatin1String {"user_hardware"}); + QFileInfo f {target + prefix}; + if (f.isExecutable ()) { + break; } } - if(m_cmnd!="") p3.start(m_cmnd); // Execute user's hardware controller + if (target.size ()) + { + // Execute user's hardware controller + p3.start(QDir::toNativeSeparators (target) + , QStringList {m_config.bands ()->find (m_freqNominal).remove ('m')}); + } // Produce a short tuneup signal m_tuneup = false; @@ -8173,7 +8236,13 @@ void MainWindow::write_transmit_entry (QString const& file_name) out << time.toString("yyMMdd_hhmmss") << " Transmitting " << qSetRealNumberPrecision (12) << (m_freqNominal / 1.e6) << " MHz " << m_modeTx - << ": " << m_currentMessage << endl; + << ": " << m_currentMessage +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; f.close(); } else @@ -8261,7 +8330,7 @@ QString MainWindow::sortHoundCalls(QString t, int isort, int max_dB) QString msg,houndCall,t1; QString ABC{"ABCDEFGHIJKLMNOPQRSTUVWXYZ _"}; QList list; - int i,j,k,m,n,nlines; + int i,j,k,n,nlines; bool bReverse=(isort >= 3); isort=qAbs(isort); @@ -8278,20 +8347,20 @@ QString MainWindow::sortHoundCalls(QString t, int isort, int max_dB) j=0; t=""; for(auto a: map.keys()) { - t1=map[a].split(" ",QString::SkipEmptyParts).at(2); + t1=map[a].split(" ",SkipEmptyParts).at(2); int nsnr=t1.toInt(); // get snr if(nsnr <= max_dB) { // keep only if snr in specified range if(isort==1) t += map[a] + "\n"; if(isort==3 or isort==4) { i=2; // sort Hound calls by snr if(isort==4) i=4; // sort Hound calls by distance - t1=map[a].split(" ",QString::SkipEmptyParts).at(i); + t1=map[a].split(" ",SkipEmptyParts).at(i); n=1000*(t1.toInt()+100) + j; // pack (snr or dist) and index j into n list.insert(j,n); // add n to list at [j] } if(isort==2) { // sort Hound calls by grid - t1=map[a].split(" ",QString::SkipEmptyParts).at(1); + t1=map[a].split(" ",SkipEmptyParts).at(1); if(t1=="....") t1="ZZ99"; int i1=ABC.indexOf(t1.mid(0,1)); int i2=ABC.indexOf(t1.mid(1,1)); @@ -8328,11 +8397,13 @@ QString MainWindow::sortHoundCalls(QString t, int isort, int max_dB) a[i]=i; } for(i=nn-1; i>-1; i--) { +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + j = (i + 1) * QRandomGenerator::global ()->generateDouble (); +#else j=(i+1)*double(qrand())/RAND_MAX; - m=a[j]; - a[j]=a[i]; - a[i]=m; - t += lines2.at(m) + "\n"; +#endif + std::swap (a[j], a[i]); + t += lines2.at(a[i]) + "\n"; } } @@ -8356,13 +8427,13 @@ void MainWindow::selectHound(QString line) */ if(line.length()==0) return; - QString houndCall=line.split(" ",QString::SkipEmptyParts).at(0); + QString houndCall=line.split(" ",SkipEmptyParts).at(0); // Don't add a call already enqueued or in QSO if(ui->textBrowser4->toPlainText().indexOf(houndCall) >= 0) return; - QString houndGrid=line.split(" ",QString::SkipEmptyParts).at(1); // Hound caller's grid - QString rpt=line.split(" ",QString::SkipEmptyParts).at(2); // Hound SNR + QString houndGrid=line.split(" ",SkipEmptyParts).at(1); // Hound caller's grid + QString rpt=line.split(" ",SkipEmptyParts).at(2); // Hound SNR m_houndCallers=m_houndCallers.remove(line+"\n"); // Remove t from sorted Hound list m_nSortedHounds--; @@ -8726,9 +8797,20 @@ void MainWindow::writeFoxQSO(QString const& msg) QFile f {m_config.writeable_data_dir ().absoluteFilePath ("FoxQSO.txt")}; if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { QTextStream out(&f); - out << QDateTime::currentDateTimeUtc().toString("yyyy-MM-dd hh:mm:ss") - << " " << fixed << qSetRealNumberPrecision (3) << (m_freqNominal/1.e6) - << t << msg << endl; + out << QDateTime::currentDateTimeUtc().toString("yyyy-MM-dd hh:mm:ss") << " " +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::fixed +#else + << fixed +#endif + << qSetRealNumberPrecision (3) << (m_freqNominal/1.e6) + << t << msg +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; f.close(); } else { MessageBox::warning_message (this, tr("File Open Error"), @@ -8855,7 +8937,13 @@ void MainWindow::write_all(QString txRx, QString message) QFile f{m_config.writeable_data_dir().absoluteFilePath(file_name)}; if (f.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { QTextStream out(&f); - out << line << endl; + out << line +#if QT_VERSION >= QT_VERSION_CHECK (5, 15, 0) + << Qt::endl +#else + << endl +#endif + ; f.close(); } else { auto const& message2 = tr ("Cannot open \"%1\" for append: %2") diff --git a/widgets/mainwindow.h b/widgets/mainwindow.h index 82f879fcd..6da871b37 100644 --- a/widgets/mainwindow.h +++ b/widgets/mainwindow.h @@ -3,6 +3,8 @@ #define MAINWINDOW_H #include +#include +#include #include #include #include @@ -605,8 +607,7 @@ private: QString m_rptRcvd; QString m_qsoStart; QString m_qsoStop; - QString m_cmnd; - QString m_cmndP1; + QStringList m_cmndP1; QString m_msgSent0; QString m_calls; QString m_CQtype; @@ -713,7 +714,7 @@ private: void pskPost(DecodedText const& decodedtext); void displayDialFrequency (); void transmitDisplay (bool); - void processMessage(DecodedText const&, Qt::KeyboardModifiers = 0); + void processMessage(DecodedText const&, Qt::KeyboardModifiers = Qt::NoModifier); void replyToCQ (QTime, qint32 snr, float delta_time, quint32 delta_frequency, QString const& mode, QString const& message_text, bool low_confidence, quint8 modifiers); void locationChange(QString const& location); void replayDecodes ();