Adapted from https://github.com/bitcoin/bitcoin/pull/24798

diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4
index 7498127860..bd95aff2a8 100644
--- a/build-aux/m4/bitcoin_qt.m4
+++ b/build-aux/m4/bitcoin_qt.m4
@@ -5,7 +5,7 @@ dnl file COPYING or http://www.opensource.org/licenses/mit-license.php.
 dnl Helper for cases where a qt dependency is not met.
 dnl Output: If qt version is auto, set bitcoin_enable_qt to false. Else, exit.
 AC_DEFUN([BITCOIN_QT_FAIL],[
-  if test "$bitcoin_qt_want_version" = "auto" && test "$bitcoin_qt_force" != "yes"; then
+  if test "$bitcoin_qt_want_version" = "auto"; then
     if test "$bitcoin_enable_qt" != "no"; then
       AC_MSG_WARN([$1; bitcoin-qt frontend will not be built])
     fi
@@ -53,15 +53,9 @@ dnl CAUTION: Do not use this inside of a conditional.
 AC_DEFUN([BITCOIN_QT_INIT],[
   dnl enable qt support
   AC_ARG_WITH([gui],
-    [AS_HELP_STRING([--with-gui@<:@=no|qt5|auto@:>@],
+    [AS_HELP_STRING([--with-gui@<:@=no|qt5|qt6|auto@:>@],
     [build bitcoin-qt GUI (default=auto)])],
-    [
-     bitcoin_qt_want_version=$withval
-     if test "$bitcoin_qt_want_version" = "yes"; then
-       bitcoin_qt_force=yes
-       bitcoin_qt_want_version=auto
-     fi
-    ],
+    [bitcoin_qt_want_version=$withval],
     [bitcoin_qt_want_version=auto])
 
   AS_IF([test "$with_gui" = "qt5_debug"],
@@ -70,6 +64,12 @@ AC_DEFUN([BITCOIN_QT_INIT],[
                  [qt_lib_suffix= ]); bitcoin_qt_want_version=qt5],
         [qt_lib_suffix= ])
 
+  AS_IF([test "$with_gui" = "qt6_debug"],
+        [AS_CASE([$host],
+                 [*darwin*], [qt_lib_suffix=_debug],
+                 [qt_lib_suffix= ]); bitcoin_qt_want_version=qt6],
+        [qt_lib_suffix= ])
+
   AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], [])
   AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], [])
   AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], [])
@@ -95,6 +95,57 @@ dnl Outputs: bitcoin_enable_qt, bitcoin_enable_qt_dbus, bitcoin_enable_qt_test
 AC_DEFUN([BITCOIN_QT_CONFIGURE],[
   qt_version=">= $1"
   qt_lib_prefix="Qt5"
+  if test "$bitcoin_qt_want_version" = "qt6"; then
+    qt_lib_prefix="Qt6"
+  fi
+
+  if test "$use_hardening" != "no"; then
+    BITCOIN_QT_CHECK([
+    AC_MSG_CHECKING([whether -fPIE can be used with this Qt config])
+    TEMP_CPPFLAGS=$CPPFLAGS
+    TEMP_CXXFLAGS=$CXXFLAGS
+    CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS"
+    CXXFLAGS="$PIE_FLAGS $CORE_CXXFLAGS $CXXFLAGS"
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+        #include <QtCore/qconfig.h>
+        #ifndef QT_VERSION
+        #  include <QtCore/qglobal.h>
+        #endif
+      ]],
+      [[
+        #if defined(QT_REDUCE_RELOCATIONS)
+        choke
+        #endif
+      ]])],
+      [ AC_MSG_RESULT([yes]); QT_PIE_FLAGS=$PIE_FLAGS ],
+      [ AC_MSG_RESULT([no]); QT_PIE_FLAGS=$PIC_FLAGS]
+    )
+    CPPFLAGS=$TEMP_CPPFLAGS
+    CXXFLAGS=$TEMP_CXXFLAGS
+    ])
+  else
+    BITCOIN_QT_CHECK([
+    AC_MSG_CHECKING([whether -fPIC is needed with this Qt config])
+    TEMP_CPPFLAGS=$CPPFLAGS
+    CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS"
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+        #include <QtCore/qconfig.h>
+        #ifndef QT_VERSION
+        #  include <QtCore/qglobal.h>
+        #endif
+      ]],
+      [[
+        #if defined(QT_REDUCE_RELOCATIONS)
+        choke
+        #endif
+      ]])],
+      [ AC_MSG_RESULT([no])],
+      [ AC_MSG_RESULT([yes]); QT_PIE_FLAGS=$PIC_FLAGS]
+    )
+    CPPFLAGS=$TEMP_CPPFLAGS
+    ])
+  fi
+
   BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS])
 
   dnl This is ugly and complicated. Yuck. Works as follows:
@@ -153,53 +204,6 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
     qt_bin_path="`$PKG_CONFIG --variable=host_bins ${qt_lib_prefix}Core 2>/dev/null`"
   fi
 
-  if test "$use_hardening" != "no"; then
-    BITCOIN_QT_CHECK([
-    AC_MSG_CHECKING([whether -fPIE can be used with this Qt config])
-    TEMP_CPPFLAGS=$CPPFLAGS
-    TEMP_CXXFLAGS=$CXXFLAGS
-    CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS"
-    CXXFLAGS="$PIE_FLAGS $CORE_CXXFLAGS $CXXFLAGS"
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-        #include <QtCore/qconfig.h>
-        #ifndef QT_VERSION
-        #  include <QtCore/qglobal.h>
-        #endif
-      ]],
-      [[
-        #if defined(QT_REDUCE_RELOCATIONS)
-        choke
-        #endif
-      ]])],
-      [ AC_MSG_RESULT([yes]); QT_PIE_FLAGS=$PIE_FLAGS ],
-      [ AC_MSG_RESULT([no]); QT_PIE_FLAGS=$PIC_FLAGS]
-    )
-    CPPFLAGS=$TEMP_CPPFLAGS
-    CXXFLAGS=$TEMP_CXXFLAGS
-    ])
-  else
-    BITCOIN_QT_CHECK([
-    AC_MSG_CHECKING([whether -fPIC is needed with this Qt config])
-    TEMP_CPPFLAGS=$CPPFLAGS
-    CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS"
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-        #include <QtCore/qconfig.h>
-        #ifndef QT_VERSION
-        #  include <QtCore/qglobal.h>
-        #endif
-      ]],
-      [[
-        #if defined(QT_REDUCE_RELOCATIONS)
-        choke
-        #endif
-      ]])],
-      [ AC_MSG_RESULT([no])],
-      [ AC_MSG_RESULT([yes]); QT_PIE_FLAGS=$PIC_FLAGS]
-    )
-    CPPFLAGS=$TEMP_CPPFLAGS
-    ])
-  fi
-
   BITCOIN_QT_PATH_PROGS([MOC], [moc-qt5 moc5 moc], $qt_bin_path)
   BITCOIN_QT_PATH_PROGS([UIC], [uic-qt5 uic5 uic], $qt_bin_path)
   BITCOIN_QT_PATH_PROGS([RCC], [rcc-qt5 rcc5 rcc], $qt_bin_path)
@@ -340,6 +344,36 @@ AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_LIBS], [
   fi
 ])
 
+dnl Internal. Check whether Qt application can be initialized.
+dnl
+dnl _BITCOIN_QT_CHECK_APP(APPLICATION_CLASS)
+dnl ----------------------------------------
+dnl
+dnl dnl Requires: QT_INCLUDES and QT_LIBS must be populated as necessary.
+dnl Inputs: $1: QCoreApplication, QGuiApplication, or QApplication.
+AC_DEFUN([_BITCOIN_QT_CHECK_APP], [
+  AC_MSG_CHECKING([for $1 initialization])
+  TEMP_CPPFLAGS="$CPPFLAGS"
+  TEMP_CXXFLAGS="$CXXFLAGS"
+  TEMP_LIBS="$LIBS"
+  CPPFLAGS="$QT_INCLUDES $CORE_CPPFLAGS $CPPFLAGS"
+  CXXFLAGS="$QT_PIE_FLAGS $CORE_CXXFLAGS $CXXFLAGS"
+  LIBS="$QT_LIBS"
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+      #include <$1>
+    ]],
+    [[
+      int argc = 1;
+      const char* argv = "core";
+      $1 app(argc, const_cast<char**>(&argv));
+    ]])],
+    [AC_MSG_RESULT([yes])],
+    [AC_MSG_RESULT([no]); BITCOIN_QT_FAIL([$1 failed to initialize.])])
+  CXXFLAGS="$TEMP_CXXFLAGS"
+  LIBS="$TEMP_LIBS"
+  CPPFLAGS="$TEMP_CPPFLAGS"
+])
+
 dnl Internal. Find Qt libraries using pkg-config.
 dnl
 dnl _BITCOIN_QT_FIND_LIBS
@@ -349,16 +383,25 @@ dnl Outputs: All necessary QT_* variables are set.
 dnl Outputs: have_qt_test and have_qt_dbus are set (if applicable) to yes|no.
 AC_DEFUN([_BITCOIN_QT_FIND_LIBS],[
   BITCOIN_QT_CHECK([
-    PKG_CHECK_MODULES([QT_CORE], [${qt_lib_prefix}Core${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_CORE_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_CORE_LIBS $QT_LIBS"],
+    PKG_CHECK_MODULES([QT_CORE], [${qt_lib_prefix}Core${qt_lib_suffix} $qt_version], [],
                       [BITCOIN_QT_FAIL([${qt_lib_prefix}Core${qt_lib_suffix} $qt_version not found])])
+    QT_INCLUDES="$QT_CORE_CFLAGS $QT_INCLUDES"
+    QT_LIBS="$QT_CORE_LIBS $QT_LIBS"
+    _BITCOIN_QT_CHECK_APP([QCoreApplication])
   ])
   BITCOIN_QT_CHECK([
-    PKG_CHECK_MODULES([QT_GUI], [${qt_lib_prefix}Gui${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_GUI_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_GUI_LIBS $QT_LIBS"],
+    PKG_CHECK_MODULES([QT_GUI], [${qt_lib_prefix}Gui${qt_lib_suffix} $qt_version], [],
                       [BITCOIN_QT_FAIL([${qt_lib_prefix}Gui${qt_lib_suffix} $qt_version not found])])
+    QT_INCLUDES="$QT_GUI_CFLAGS $QT_INCLUDES"
+    QT_LIBS="$QT_GUI_LIBS $QT_LIBS"
+    _BITCOIN_QT_CHECK_APP([QGuiApplication])
   ])
   BITCOIN_QT_CHECK([
-    PKG_CHECK_MODULES([QT_WIDGETS], [${qt_lib_prefix}Widgets${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_WIDGETS_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_WIDGETS_LIBS $QT_LIBS"],
+    PKG_CHECK_MODULES([QT_WIDGETS], [${qt_lib_prefix}Widgets${qt_lib_suffix} $qt_version], [],
                       [BITCOIN_QT_FAIL([${qt_lib_prefix}Widgets${qt_lib_suffix} $qt_version not found])])
+    QT_INCLUDES="$QT_WIDGETS_CFLAGS $QT_INCLUDES"
+    QT_LIBS="$QT_WIDGETS_LIBS $QT_LIBS"
+    _BITCOIN_QT_CHECK_APP([QApplication])
   ])
   BITCOIN_QT_CHECK([
     PKG_CHECK_MODULES([QT_NETWORK], [${qt_lib_prefix}Network${qt_lib_suffix} $qt_version], [QT_INCLUDES="$QT_NETWORK_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_NETWORK_LIBS $QT_LIBS"],
@@ -368,7 +411,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS],[
   BITCOIN_QT_CHECK([
     PKG_CHECK_MODULES([QT_TEST], [${qt_lib_prefix}Test${qt_lib_suffix} $qt_version], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no])
     if test "$use_dbus" != "no"; then
-      PKG_CHECK_MODULES([QT_DBUS], [${qt_lib_prefix}DBus $qt_version], [QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no])
+      PKG_CHECK_MODULES([QT_DBUS], [${qt_lib_prefix}DBus $qt_version], [QT_INCLUDES="$QT_DBUS_CFLAGS $QT_INCLUDES" QT_LIBS="$QT_LIBS $QT_DBUS_LIBS" QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no])
     fi
   ])
 ])
diff --git a/configure.ac b/configure.ac
index 86d5e5e214..af5e7c06c9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1726,9 +1726,11 @@ if test "$enable_wallet" != "no"; then
     echo "    with sqlite   = $use_sqlite"
     echo "    with bdb      = $use_bdb"
 fi
-echo "  with gui / qt   = $bitcoin_enable_qt"
 if test $bitcoin_enable_qt != "no"; then
+    echo "  with gui / qt   = $bitcoin_enable_qt, $qt_lib_prefix"
     echo "    with qr       = $use_qr"
+else
+    echo "  with gui / qt   = $bitcoin_enable_qt"
 fi
 echo "  with zmq        = $use_zmq"
 if test $enable_fuzz = "no"; then
diff --git a/depends/config.site.in b/depends/config.site.in
index f6bed6a9d4..c1c0a8448d 100644
--- a/depends/config.site.in
+++ b/depends/config.site.in
@@ -17,6 +17,10 @@ ac_tool_prefix="${host_alias}-"
 if test -z "$with_boost"; then
   with_boost="$depends_prefix"
 fi
+
+if test -z "$with_qt_libdir"; then
+  with_qt_libdir="${depends_prefix}/lib"
+fi
 if test -z "$with_qt_plugindir"; then
   with_qt_plugindir="${depends_prefix}/plugins"
 fi
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index ae3f9aa686..2aaf6baa75 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -16,7 +16,6 @@
 #include <qt/guiutil.h>
 #include <qt/peertablesortproxy.h>
 #include <qt/platformstyle.h>
-#include <qt/walletmodel.h>
 #include <rpc/client.h>
 #include <rpc/server.h>
 #include <util/strencodings.h>
@@ -26,6 +25,10 @@
 
 #include <univalue.h>
 
+#ifdef ENABLE_WALLET
+#include <qt/walletmodel.h>
+#endif
+
 #include <QAbstractButton>
 #include <QAbstractItemModel>
 #include <QDateTime>
