If you want your copy of QGIS display it’s legal licensing status, this is the missing code for you.
Copy this in your QGIS Python script editor (WARNING: DO NOT RUN THIS IN AN IMPORTANT USER PROFILE, I will NOT help you if it breaks something):
import os
from qgis.core import QgsApplication, QgsSettings
from qgis.PyQt.QtGui import QColor, QImage, QPainter, QPen, QStaticText
from qgis.PyQt.QtWidgets import QMessageBox
def install_qgis_license():
# WARNING: This fucks around with your profiles and stuff!
# QgsCustomization is not available from Python so just yolo here and write a fresh file if possible
profile_directory = QgsApplication.qgisSettingsDirPath()
customization_ini_filepath = profile_directory + "QGIS/QGISCUSTOMIZATION3.ini"
if os.path.isfile(customization_ini_filepath):
# ain't gonna be touchin dat!
text = (
"QGISCUSTOMIZATION3.ini EXISTS! UNLICENSED HACKING DETECTED!\n"
"Or: Custom license has been installed already...\n"
"Anyways, we are not creating a *new* license now ;)"
)
messagebox = QMessageBox()
messagebox.setText(text);
messagebox.exec()
return
# get existing splash image
splash_path = QgsApplication.splashPath() # :/images/splash/
splash_image_file = splash_path + "splash.png"
splash_image = QImage(splash_image_file)
# paint new splash image
new_splash_image = QImage(splash_image)
painter = QPainter()
painter.begin(new_splash_image)
# white bold font plz
font = QgsApplication.font()
font.setBold(True)
painter.setFont(font)
pen = painter.pen()
pen.setColor(QColor("white"))
painter.setPen(pen)
# place text at appropriate location
label_text = f"This QGIS©®™ is legally licensed to {os.getlogin()}"
label_text_rect = painter.boundingRect(0, 0, 0, 0, 0, label_text) # returns new rect that fits text
left_offset = new_splash_image.width() - label_text_rect.size().width() - 20
painter.drawText(left_offset, 840, label_text)
painter.end()
# create license dir if necessary
new_splash_dir_path = profile_directory + "license"
try:
os.mkdir(new_splash_dir_path)
except FileExistsError:
pass
save_success = new_splash_image.save(new_splash_dir_path + "/splash.png")
if save_success:
print(f"Initialized new QGIS license....")
else:
print("Error on QGIS license initialization, this will get reported!")
return
# enable license dir for splash image lookup in QGISCUSTOMIZATION3.ini
with open(customization_ini_filepath, "w") as sink:
sink.write("[Customization]\n")
sink.write(f"splashpath={new_splash_dir_path}/") # must have trailing slash
# enable loading of QGISCUSTOMIZATION3.ini in user profile
QgsSettings().setValue(r"UI/Customization/enabled", True)
print("License installed, reboot QGIS to activate!")
messagebox = QMessageBox()
messagebox.setText("License installed, restart QGIS now to activate!");
messagebox.exec()
#install_qgis_license()
Then (if you really want to do it), uncomment the function call in the last line and execute the script. Follow the instructions.
To clean up remove or restore the QGIS/QGISCUSTOMIZATION3.ini
file in your profile and remove the license
directory from your profile, restore the previous value of UI/Customization/enabled
in your profile (just remove the line or disable Settings -> Interface Customization).
If you want to hate yourself in the future, put it in a file called startup.py
in QStandardPaths.standardLocations(QStandardPaths.AppDataLocation)
aka the directory which contains the profiles
directory itself.
BTW: If you end up with QGIS crashing and lines like these in the error output:
...
Warning: QPaintDevice: Cannot destroy paint device that is being painted
QGIS died on signal 11
...
It is probably not a Qt issue that caused the crash. The QPaintDevice
warning might just be Qt telling you about your painter being an issue during clean up of the actual crash (which might just be a wrong name or indentation somewhere in your code, cough).