diff --git a/aqt/cli.py b/aqt/cli.py
index 412d454..3913ee3 100644
--- a/aqt/cli.py
+++ b/aqt/cli.py
@@ -260,4 +260,6 @@ class Cli():
     def run(self, arg=None):
         args = self.parser.parse_args(arg)
         self._setup_logging(args)
-        args.func(args)
+        if getattr(args, 'func', None) is None:
+            return self.show_help(args)
+        return args.func(args)

Running aqt without arguments produces error
If you run aqt without arguments, you get a confusing error:

```
C:\Users\nyanpasu64\scoop\apps\consolez\current>aqt
Traceback (most recent call last):
  File "c:\users\nyanpasu64\appdata\local\programs\python\python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "c:\users\nyanpasu64\appdata\local\programs\python\python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\nyanpasu64\.local\bin\aqt.exe\__main__.py", line 7, in <module>
  File "c:\users\nyanpasu64\.local\pipx\venvs\aqtinstall\lib\site-packages\aqt\__init__.py", line 38, in main
    return cli.run()
  File "c:\users\nyanpasu64\.local\pipx\venvs\aqtinstall\lib\site-packages\aqt\cli.py", line 248, in run
    args.func(args)
AttributeError: 'Namespace' object has no attribute 'func'
```

I think you should print help, if no subcommand is recognized. Maybe via `Cli.parser`'s `func`, not sure though.
diff --git a/tests/test_cli.py b/tests/test_cli.py
index cd55909..29bb0e4 100644
--- a/tests/test_cli.py
+++ b/tests/test_cli.py
@@ -52,3 +52,26 @@ def test_cli_check_mirror():
     args = cli.parser.parse_args(arg)
     assert args.base == 'https://download.qt.io/'
     assert cli._check_mirror(args.base)
+
+
+def test_cli_launch_with_no_argument(capsys):
+    expected = "".join(["usage: aqt [-h] [--logging-conf LOGGING_CONF] [--logger LOGGER]\n",
+                        "           {install,tool,list,help} ...\n",
+                        "\n",
+                        "Installer for Qt SDK.\n",
+                        "\n",
+                        "optional arguments:\n",
+                        "  -h, --help            show this help message and exit\n",
+                        "  --logging-conf LOGGING_CONF\n",
+                        "                        Logging configuration ini file.\n",
+                        "  --logger LOGGER       Specify logger name\n",
+                        "\n",
+                        "subcommands:\n",
+                        "  Valid subcommands\n",
+                        "\n",
+                        "  {install,tool,list,help}\n",
+                        "                        subcommand for aqt Qt installer\n"])
+    cli = aqt.cli.Cli()
+    cli.run([])
+    out, err = capsys.readouterr()
+    assert out == expected

pip install -e .[dev]
parse_log_pytest
pytest
pytest
apt-get update apt-get install -y 7zip
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/miurahr/aqtinstall.git@67eee8d2bd73acc36c14206d684f4901bbad71d6#egg=aqtinstall
certifi==2025.1.31
charset-normalizer==3.4.1
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
idna==3.10
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
py7zr==0.7.4
pycryptodome==3.22.0
pytest @ file:///croot/pytest_1738938843180/work
requests==2.32.3
texttable==1.7.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
urllib3==2.3.0

name: aqtinstall
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - aqtinstall==0.9.0b4.dev1
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - idna==3.10
      - py7zr==0.7.4
      - pycryptodome==3.22.0
      - requests==2.32.3
      - texttable==1.7.0
      - urllib3==2.3.0
prefix: /opt/conda/envs/aqtinstall

tests/test_cli.py::test_cli_launch_with_no_argument
tests/test_cli.py::test_cli_help tests/test_cli.py::test_cli_check_module tests/test_cli.py::test_cli_check_combination tests/test_cli.py::test_cli_check_version tests/test_cli.py::test_cli_check_mirror
aqt/cli.py
aqt/cli.py