Difference between revisions of "Qt Interface Mac"

From Lazarus wiki
Jump to navigationJump to search
(Minor change to Uninstalling)
m (→‎Outdated Build Guide: OSX ->macOS; fixed broken links to Apple documentation)
 
(48 intermediate revisions by 11 users not shown)
Line 1: Line 1:
 +
{{Platform only|macOS}}
 +
{{Platform only|Qt|Qt|Qt widgetset}}
 +
{{Qt Interface Mac}}
 
==Introduction==
 
==Introduction==
  
Sections 2, 3, and 4 only need to be done if you are creating the Qt libraries, interface library, and interface framework yourself. If you have installed the interface framework using Qt4IntfFramework_PowerPC.dmg (in file [http://users.pandora.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html mac_bin-qt4pas-1.xx.zip]), you can start with section 5 and begin compiling the demo programs.
+
There are two main path you can follow to start deploying your first Qt Application for Mac:
 +
* Install compiled Interface Binary Bindings and Qt Framework Library
 +
* Build yourself Interface Binary Bindings and Qt Framework Library (hard and may take many hours)
  
'''Notes on terminology:'''
+
==Quick Install and Use Guide==
 +
 
 +
Fastest way to get you ready to develop applications with Qt Framework (+ LCL Widgetset)
 +
 
 +
===Qt4 Framework Library===
 +
 
 +
First you need to download the Cocoa Mac binary package of '''Qt4 Framework Library''' from [http://qt.nokia.com/downloads/qt-for-open-source-cpp-development-on-mac-os-x Nokia Qt download section] or from a [ftp://ftp.trolltech.com/qt/source/ Trolltech mirror]. The file you need is named something like ''qt-mac-opensource-4.7.4.dmg'' or with greater version.
 +
* Now Mount the disk image and install the package that you find inside.
 +
 
 +
===Qt4 Interface Binary Bindings===
 +
 
 +
Next you need to download the Interface Binary Bindings from [http://users.telenet.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html Jan.Van.hijfte site], search for '''Mac: Libray Binary Intel''', the file you download is named something like ''mac_bin-qt4pas-V2.4_Qt4.5.3.zip'' (don't worry about version in file name, it's indicating the lowest version required by Binaries).
 +
* After you click on the downloaded file it will be automatically unpacked and you will see another zip inside, unzip it too and install the package you find inside.
 +
* (Optional) Rename qt4.pas in qt45.pas and copy it inside ''/Developer/lazarus/lcl/interfaces/qt''
  
These instructions generally use the term "Qt libraries" to describe the QtCore and QtGui libraries that are created in section 2. The term "interface library" is used to describe the Qt4Intf library created in section 3 that interfaces between Free Pascal and the Qt libraries. The "interface framework" is an OS X-specific folder created in section 4 that contains both the Qt libraries and interface library and can be linked against when compiling with Free Pascal.
+
===Build Lazarus IDE on Qt===
 +
Lazarus 1.2/1.3
 +
You must rebuild libQt4Pas library according to your needs (32/64bit).
 +
Build with make (from terminal):
 +
*32bit (Carbon): make bigide LCL_PLATFORM=qt
 +
*64bit (Cocoa): make bigide OS_TARGET=darwin CPU_PLATFORM=x86_64 LCL_PLATFORM=qt
  
If you're not familiar with OS X terms such as "framework" and "app bundle", refer to Apple's extensive [http://developer.apple.com/documentation/MacOSX/ online documentation].
+
Build from Lazarus IDE:
 +
*32bit just set qt widgetset in ide build config dialog and rebuild.
 +
*64bit set qt widgetset and add -Px86_64 -Tdarwin in ide build config dialog.IMPORTANT NOTE: you must build IDE with make first (from terminal), and then you can rebuild from IDE because of bug (dunno where it is) which causes linking of lazarus against 32bit objects.
  
'''''Important!''''' To run any of the scripts mentioned in sections 3-6, you may need to change its permission so that OS X will allow it to be executed:
+
===Build Lazarus with qt-cocoa (qt binary distribution from nokia >= 4.7.4)===
 +
'''Qt binary distribution (>=4.7.4) is 64bit (cocoa only), so we need 64bit Qt4Pas and 64bit 2.6.0 compiler'''
 +
* Download and install fpc-2.6.0 (with 2.4.4 64bit you can compile lazarus etc but it will crash imediatelly).I've used "svn co http://svn.freepascal.org/svn/fpc/tags/release_2_6_0 fpc260" , then "fpcmake -Tall" ,  "make all", "sudo make install", "sudo make CPU_TARGET=x86_64 make install" (of course you need fpc-2.4.4 to build 2.6.0, you can download dmgs from lazarus daily snapshots.
 +
* Download qt-4.7.4 from nokia site (DO NOT DOWNLOAD 4.8.0 SINCE IT'S WRONGLY PACKAGED atm - won't work (missing symbols in QWebKit) https://bugreports.qt.nokia.com/browse/QTBUG-23157 )
 +
* Install qt
 +
* Download qt bindings source (Qt4Pas).
 +
* Open Qt4Pas.pro and comment CXXFLAGS += -mstackrealign (since it will be error with 64bit build on mac).
 +
* Build and install bindings as in readme.
 +
* dload lazarus trunk.
  
<pre> chmod +x script_name.sh</pre>
+
'''Build from terminal (short way)'''
 +
* make bigide CPU_TARGET=x86_64 LCL_PLATFORM=qt OPT="-k'-framework' -k'ApplicationServices'" (don't forget to change default compiler in Tools->Options->Compiler path)
  
==Creating the Qt libraries from Qt Open Source Edition==
+
'''Build carbon from terminal, then ide from ide'''
 +
* build it for carbon (32bit), startlazarus, go to Tools->Options, change cpu from /usr/local/bin/fpc to /usr/local/bin/ppcx64 in Compiler path  (also fix source path to 2.6.0 if it isn't already fixed).
 +
*Tools->Configure Build Lazarus-> choose LCL widget type qt, in options write -k-framework -kApplicationServices (yes, without any quotes)
 +
* Build lazarus
  
2.1. Download the Qt Open Source from Trolltech's [http://www.trolltech.com/developer/downloads/qt/mac Web site]. This file will be named something like qt-mac-opensource-src-4.1.1.tar.gz.
+
'''Spotted problems'''
 +
*Qt-cocoa have problems with mouseGrabber (possible it's fixed in 4.8.0)
 +
*Cannot build pure cocoa widget set ATSUXXXX symbols are missing (probably need to pass more frameworks to linker)
  
2.2. Double-click the file and let StuffIt expand it to a folder with the same name but without the .tar.gz extension.
+
'''Build environment'''
 +
* 10.6.8 (Snow Leopard)
 +
* XCode 3.(Don't know - but it's free one)
  
2.3. Move the resulting folder to your home folder (/Users/login).
+
===Build your first Qt Application===
  
2.4. Make sure the OS X DevSDK package is installed. With OS X 10.3, this package is on the XCode Tools CD.
+
* Note: Latest Lazarus IDE creates [[Application Bundle]]s by himself when you create a new project, so you don't need to worry about this (while you leave the ''Create Application Bundle'' check box inside ''Project -> Project Options -> Application tab'' to it's default ''enabled'' state.
  
2.5. Open a Terminal window.
+
# Create a new project or use the default one that Lazarus IDE creates on first launch.
 +
# Add some buttons and edit boxes to your form.
 +
# Inside ''Project -> Project Options -> Compile Options -> Build modes'' click on empty ''macro line'' and choose '''LCLWidgetType''', in relative ''macro value'' choose '''qt''' and click ''Ok''.
 +
# Now click green ''Run'' arrow and congratulate with yourself for building your first Qt Application.
  
2.6. Change to the Qt source folder:
+
----
  
<pre> cd ~/qt-mac-opensource-src-4.1.1</pre>
+
==Outdated Build Guide==
  
2.7. Enter this command:
+
[[User:Shebuka|Shebuka]] 17:03, 8 September 2011 (CEST) At this time, this part of guide can't be followed, because all shell script mentioned here to build Interface and Libraries are not present in [http://users.pandora.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html Mac library sources].
  
<pre> ./configure</pre>
+
Sections 2, 3, and 4 only need to be done if you are creating the Interface library, and Interface framework yourself. If you have installed the interface framework using  [http://users.pandora.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html  Mac Library Binary (intel)], you can start with section 5 and begin compiling the demo programs.
  
2.8. Enter yes when prompted. When done configuring, a message will be outputted.
+
'''Notes on terminology:'''
  
2.9. Enter this command:
+
These instructions generally use the term "Qt libraries" to describe the QtCore and QtGui libraries that are created in section 2. The term "interface library" is used to describe the Qt4Intf library created in section 3 that interfaces between Free Pascal and the Qt libraries. The "interface framework" is an macOS-specific folder created in section 4 that contains both the Qt libraries and interface library and can be linked against when compiling with Free Pascal.
  
<pre> make</pre>
+
If you're not familiar with macOS terms such as "framework" and "app bundle", refer to Apple's extensive [https://developer.apple.com/documentation/ online documentation].
  
This will compile the source with a GNU Compiler Collection (GCC) c++ compiler that's part of the OS X DevSDK package. This compilation will create QtCore.framework and QtGui.framework in the Qt source's lib folder. These frameworks contain the Qt libraries that we will be using.
+
'''''Important!''''' To run any of the scripts mentioned in sections 3-6, you may need to change its permission so that macOS  will allow it to be executed:
  
'''''Important!'''''  Compilation may take several hours depending on the speed of your computer.  
+
<pre> chmod +x script_name.sh</pre>
  
2.10. '''''Optional'''''. If for some reason you don't want to create and use the Qt interface framework, you will need to install the resulting Qt libraries to /usr/local/Trolltech by entering this command:
+
===Install the Qt Library Frameworks===
  
<pre>
+
* Download and install Qt4 from Trolltech/Nokia: [http:/ftp://ftp.trolltech.com/qt/source/]. The file will be named something like qt-mac-opensource-4.5.X.dmg.
sudo make install
+
* Several Qt frameworks will be installed in /Library/Frameworks. QtCore.framework and QtGui.framework are used.
</pre>
 
  
==Creating the Qt interface library==
+
===Creating the Qt interface library===
  
A script file for doing this is included with [http://users.pandora.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html mac_qt4pas-1.xx.zip]. Download and double-click this file to create folder qt4pas-1.xx. Move this folder to your home folder (/Users/login) and change to it (cd). Run the script as follows:
+
A script file for doing this is included with [http://users.pandora.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html Mac library source]. The downloaded file will be named like mac_qt4pas-V1.XX_Qt4.4.X.zip Download and double-click this file to create folder qt4pas-V1.XX_Qt4.4.X.zip. Move this folder to your home folder and change to it (cd). Run the script as follows:
  
 
<pre> ./compile_lib_mac.sh</pre>
 
<pre> ./compile_lib_mac.sh</pre>
  
This script will use the GCC g++ compiler to compile qtpas.cpp and create Qt4Intf, the Qt interface library. If the script can't find the Qt libraries, it will output an error message -- this will happen if you're using a different version of the Qt source than the script expects. To fix this error, edit the script and make sure the QT4 setting specifies the path to your Qt source folder.
+
This script will use the GCC g++ (installation of macOS DevSDK (Xcode) is required) compiler to compile qtpas.cpp and create Qt4Intf, the Qt interface library. If the script can't find the Qt4 library frameworks, it will output an error message. The script does not check the exact Qt version, use the appropriate Qt (Qt4.3.X cannot be mixed with Qt 4.4.X)
  
==Creating the Qt interface framework==
+
===Creating the Qt interface framework===
  
 
A script file for doing this is included with mac_qt4pas-1.xx.zip. Run the script as follows:
 
A script file for doing this is included with mac_qt4pas-1.xx.zip. Run the script as follows:
Line 63: Line 106:
 
<pre> sudo ./create_framework_mac.sh</pre>
 
<pre> sudo ./create_framework_mac.sh</pre>
  
This creates the Qt4Intf.framework folder under /Library/Frameworks and copies the Qt libraries and Qt interface library to it. For more information, take a look at the script.
+
This creates the Qt4Intf.framework folder under /Library/Frameworks.  
 
+
Note that sudo is required because of the need of write access in the /Library/Frameworks folder.
Note that sudo is required because of the need to copy into the /Library folder.
 
  
If the script can't find the Qt libraries it needs, it will output an error message -- you may need to edit the script to make sure the Qt4 setting specifies the path to your Qt source folder.
+
If the script can't find the Qt4Intf library it needs, it will output an error message. you need to compile it first (see step above)
  
==Compiling the non-Lazarus demo programs with Free Pascal==
+
===Compiling the non-Lazarus demo programs with Free Pascal===
  
 
The Pascal source for several demo programs is included in file [http://users.pandora.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html mac_demos-1.xx.zip]. Download and double-click this file to create folder demos-1.xx. Move this folder to your home folder (/Users/login) and change to it (cd).
 
The Pascal source for several demo programs is included in file [http://users.pandora.be/Jan.Van.hijfte/qtforfpc/fpcqt4.html mac_demos-1.xx.zip]. Download and double-click this file to create folder demos-1.xx. Move this folder to your home folder (/Users/login) and change to it (cd).
 
If necessary, copy the qt4.pas file into the demo folder. The qt4.pas file can be found in mac_qt4pas-1.xx.zip or mac_bin-qt4pas-1.xx.zip.
 
  
 
To compile one of the demo programs:
 
To compile one of the demo programs:
Line 79: Line 119:
 
<pre>
 
<pre>
 
  cd somedemo
 
  cd somedemo
ln -s ../qt4.pas qt4.pas
 
 
  ../compile_exe_fr_mac.sh somedemo
 
  ../compile_exe_fr_mac.sh somedemo
 
</pre>
 
</pre>
Line 85: Line 124:
 
This will compile the demo program with Free Pascal, creating an executable file with the same name.
 
This will compile the demo program with Free Pascal, creating an executable file with the same name.
  
'''''Tip:''''' The ln command creates a symbolic link to the qt4.pas file and allows you to use a single copy of qt4.pas to compile all the demo programs. Normally with your own programs you would copy qt4.pas into your source folder and the ln command would not be necessary.
+
'''''Tip:''''' The compile script uses the compiler option -Fu..(find units in parent directory) to only need a single copy for all demoes of the rather large Qt4.pas file.
  
 
Note that Lazarus is not required to compile these demo programs.
 
Note that Lazarus is not required to compile these demo programs.
  
==Creating a demo program application bundle==
+
===Creating a demo program application bundle===
  
To create a double-clickable application on OS X, you need to create an app bundle. An app bundle is a folder with an .app extension in its name that looks like a file to the user. A script file is included for doing this:
+
To create a double-clickable application on macOS, you need to create an app bundle. An app bundle is a folder with an .app extension in its name that looks like a file to the user. A script file is included for doing this:
  
 
<pre> ../create_app_mac.sh somedemo</pre>
 
<pre> ../create_app_mac.sh somedemo</pre>
Line 101: Line 140:
 
In Finder, double-click the somedemo application (not the executable file) to launch it. You can also drag and drop the somedemo application onto the dock and launch it from there.
 
In Finder, double-click the somedemo application (not the executable file) to launch it. You can also drag and drop the somedemo application onto the dock and launch it from there.
  
==Compiling the Lazarus LCL for the Qt widgetset==
+
===Creating a Qt based Lazarus===
 +
 
 +
====Starting purely from source====
 +
Note: The X11 package does not have to be installed at all.
 +
 
 +
* Checkout svn source
 +
 
 +
in a terminal do
 +
 
 +
svn co http://svn.freepascal.org/svn/lazarus/trunk lazarus
 +
 
 +
* Compile lazarus using installed Qt4Intf framework
 +
* adapt USE_QT_45 to the used Qt version
 +
* since svn >= 21913, Qt 4.5 is default, no need to define any USE_XX_YY when using Qt 4.5
 +
 
 +
cd lazarus
 +
make clean all LCL_PLATFORM=qt OPT="-dUSE_QT_45 -k'-framework' -k'Qt4Intf' -k'-lobjc' -k'-framework' -k'Foundation'"
 +
 
 +
* run lazarus :-)
 +
 
 +
./startlazarus
 +
 
 +
====Starting from a Gtk based Lazarus====
  
Currently Lazarus on OS X is only available for the X11-based GTK widgetset. The compiled LCL units included with Lazarus are only available for the GTK widgetset as well. The LCL units are also installed read-only on OS X, so the easiest way of compiling them for the Qt widgetset is simply to copy the LCL source to your home folder and rebuild it there. Here are the steps:
+
Currently Lazarus is only available for the X11-based GTK widgetset. The compiled LCL units included with Lazarus are only available for the GTK widgetset as well. The LCL units are also installed read-only, so the easiest way of compiling them for the Qt widgetset is simply to copy the LCL source to your home folder and rebuild it there. Here are the steps:
  
7.1. Copy the "lazarus" folder from /usr/local/share to your home folder (/Users/login). Hold down the Option key when dragging so Finder copies rather than moves your Lazarus folder.
+
* Copy the "lazarus" folder from /usr/local/share to your home folder (/Users/login).
  
 
'''''Tip:''''' How do you get to the Lazarus folder? In Finder, choose Go | Go to Folder and enter /usr, then navigate to /usr/local/share.
 
'''''Tip:''''' How do you get to the Lazarus folder? In Finder, choose Go | Go to Folder and enter /usr, then navigate to /usr/local/share.
Line 113: Line 174:
 
'''''Tip:''''' For the purposes of these examples, you really only need to copy the Lazarus "lcl" folder, but you'll need to ignore the warnings that Lazarus gives you later on.
 
'''''Tip:''''' For the purposes of these examples, you really only need to copy the Lazarus "lcl" folder, but you'll need to ignore the warnings that Lazarus gives you later on.
  
7.2. Make sure the Qt widgetset is using an up-to-date version of qt4.pas. If necessary, copy the qt4.pas file used in section 5 above into /Users/login/Lazarus/lcl/interfaces/qt.
+
* Make sure the Qt widgetset is using an up-to-date version of qt4.pas. Compare the version of qt4.pas file used in section 5 above with /Users/login/Lazarus/lcl/interfaces/qt/qt4.pas. The version should be indicated in a comment at the top of qt4.pas. If necessary, install a more recent version of Lazarus.
  
7.3. Start Lazarus by opening an X11 window and entering:
+
* Start Lazarus by opening an X11 window and entering:
  
 
<pre>
 
<pre>
Line 122: Line 183:
 
</pre>
 
</pre>
  
7.4. In Lazarus, choose Environment | Environment options. On the Files tab, change the Lazarus directory from /usr/local/share/lazarus to
+
* In Lazarus, choose Tools -> Options -> Environment. On the Files tab, change the Lazarus directory from /usr/local/share/lazarus to
  
 
<pre> /Users/login/Lazarus</pre>
 
<pre> /Users/login/Lazarus</pre>
Line 128: Line 189:
 
If you only copied the "lcl" folder, you'll get a warning when you click OK. Click Ignore to ignore  the warning.
 
If you only copied the "lcl" folder, you'll get a warning when you click OK. Click Ignore to ignore  the warning.
  
7.5. In Lazarus, choose Tools | Configure "Build Lazarus". Set Build LCL to "Build"; set all others to "None". Also click "qt" under LCL interface.
+
* In Lazarus, choose Tools | Configure "Build Lazarus". Set Build LCL to "Build"; set all others to "None". Also click "qt" under LCL interface.
 +
 
 +
* Click the Build button.
  
7.6. In Lazarus, choose Tools | Build Lazarus.
+
* When Free Pascal is done compiling the LCL, check that you have newly created .ppu and .o files in /Users/login/Lazarus/lcl/units/powerpc-darwin/qt.
  
7.7. When Free Pascal is done compiling the LCL, check that you have newly created .ppu and .o files in /Users/login/Lazarus/lcl/units/powerpc-darwin/qt.
+
* Choose Tools | Configure, restore the LCL interface setting to "gtk", then click "Save settings".
  
==Creating an LCL app that uses the Qt widgetset==
+
===Creating an LCL app that uses the Qt widgetset===
  
8.1. Create a new project in Lazarus. When you started Lazarus, it created a new project -- you can use this.
+
* Create a new project in Lazarus. When you started Lazarus, it created a new project -- you can use this.
  
8.2. In Lazarus, choose Project | Compiler Options. On the Paths tab, select "qt" under LCL Widget Type.
+
* In Lazarus, choose Project | Compiler Options. On the Paths tab, select "qt" under LCL Widget Type.
  
8.3. On the Linking tab, select Pass Options To The Linker and enter
+
* On the Linking tab, select Pass Options To The Linker and enter
  
<pre> -framework Qt4Intf</pre>
+
<pre> -framework Qt4Intf -lobjc -framework Foundation</pre>
  
 
and click OK.
 
and click OK.
  
8.4. Add one or more controls to your project's main form. Since the Qt widgetset is a work in progress, consult [[Road_To_1.0#Widgetset_dependent_components]] to see which controls are working.
+
* Add one or more controls to your project's main form. Since the Qt widgetset is a work in progress, consult [[Roadmap#Widgetset_dependent_components]] to see which controls are working.
 +
 
 +
In the meantime qt widgetset becomes more mature, so you can see [http://wiki.lazarus.freepascal.org/Image:macosxqt.png Lazarus Qt IDE under macOS]
 +
 
 +
* Save the project to a folder in your home folder (/Users/login).
 +
 
 +
* In Lazarus, choose Run | Build to compile the project.
 +
 
 +
'''''Tip:''''' You can also compile your project from a script:
 +
 
 +
<pre>
 +
qtunits=~/lazarus/lcl/units/powerpc-darwin
 +
/usr/local/bin/fpc -dLCL -WG -Sd -gl -O1 -Cirot -k'-framework' -k'Qt4Intf' -k'-lobjc' -Fu$qtunits -Fu$qtunits/qt myproj.lpr
 +
</pre>
 +
 
 +
You can change most of the switches as needed, but be sure to leave the -k switches alone. If necessary, change the first line to the path to the LCL units you created in the previous section.
  
8.5. Save the project to a folder in your home folder (/Users/login).
+
* Before running the app, make sure you've created an app bundle for it. You can copy the create_app_mac.sh script from section 6 to your project's folder and run it to create an app bundle for your compiled project.
  
8.6. In Lazarus, choose Run | Build to compile the project.
+
* To run the app, double-click the application (not the executable file) in Finder or drag it to the dock and launch it from there.
  
8.7. Before running the app, make sure you've created an app bundle for it. You can copy the create_app_mac.sh script from section 6 to your project's folder and run it to create an app bundle for your compiled project.
+
* Before writing mac apps read [https://developer.apple.com/design/human-interface-guidelines/macos/overview/themes/ macOS Human Interface guidelines].
  
8.8. To run the app, double-click the application (not the executable file) in Finder or drag it to the dock and launch it from there.
+
----
  
==Distributing an app that uses the Qt interface framework==
+
==Distributing an app that uses the Qt Interface Framework==
  
9.1. The create_app_mac.sh script only creates a symbolic link inside the app bundle to the actual executable file. To copy the executable file into the app bundle in order to distribute it along with the app bundle, do this:
+
* The Lazarus IDE creates a symbolic link inside the application bundle to the actual executable file. To copy the executable file into the application bundle in order to distribute it along with the application bundle, do this:
  
 
<pre>
 
<pre>
  rm myprogram.app/contents/macos/myprogram
+
cd /path/to/your/application/bundle
  cp -p myprogram myprogram.app/contents/macos/myprogram
+
  rm MyApp.app/Contents/MacOS/MyApp
 +
  cp -p MyApp MyApp.app/Contents/MacOS/MyApp
 
</pre>
 
</pre>
  
Substitute the name of your program for "myprogram".
+
You should substitute the name of your application for "MyApp" above.
 +
 
 +
* Consult [[Deploying Your Application#An Application Bundle]] for help with creating a distributable disk image file (.dmg extension) from your application bundle folder. Ignore the discussion of X11 and GTK since your app does not require them!
  
9.2. Consult [[Deploying Your Application]] for help with creating a distributable disk image file (.dmg extension) from your app bundle folder. Ignore the discussion of X11 and GTK since your app doesn't require them!
+
* Your application will depend on the Qt4 Framework Library and on the Qt4 Interface Binary Bindings. You can put these files  inside your application bundle like you do with .dylib following [[macOS Programming Tips#Using a library in a Mac application]].
  
9.3. Be sure to install Qt4IntfFramework_PowerPC.dmg on other computers along with your app's .dmg since this installs the Qt interface framework that your app requires (as specified in the compile_exe_fr_mac.sh script or in step 8.3 above).
+
* Read [http://qt-project.org/doc/qt-4.8/deployment-mac.html Deploying an Application on macOS] about adding the Qt framework to your application bundle. Very handy for that purpose is the tool ''macdeployqt''.
  
'''''Important!'''''  Qt4IntfFramework_PowerPC.dmg is intended for use with open-source apps only. If your app is not distributed with an open source license, you need to obtain a commercial Qt license from Trolltech.
+
==Uninstalling the Qt4 Interface and Qt4 Framework==
  
==Uninstalling the Qt interface framework==
+
* If you need to remove the Qt4 Interface from your computer, simply drag the Qt4Pas.framework folder from /Library/Frameworks to the trash. Finder will prompt you for your password before allowing this.
  
If you need to remove the Qt interface framework from your computer, simply drag the Qt4Intf.framework folder from /Library/Frameworks to the trash. Finder will prompt you for your password before allowing this.
+
* If you need to remove the Qt4 Framework from your computer, simply drag the Qt3Support.framework and all QtXxxx.framework folders (like QtCore.framework, QtGui.framework, QtWebKit.framework ecc.) from /Library/Frameworks to the trash. Finder will prompt you for your password before allowing this.
  
You can also drag QtIntfFramework.pkg from /Library/Receipts to the trash.
+
* (Optional) You can also drag Qt4 Free Pascal Interface.pkg (if present) from /Library/Receipts to the trash.

Latest revision as of 01:09, 27 January 2020

macOSlogo.png

This article applies to macOS only.

See also: Multiplatform Programming Guide

Qt logo 2013.svg

This article applies to Qt widgetset only.

See also: Multiplatform Programming Guide

English (en) 日本語 (ja)

Introduction

There are two main path you can follow to start deploying your first Qt Application for Mac:

  • Install compiled Interface Binary Bindings and Qt Framework Library
  • Build yourself Interface Binary Bindings and Qt Framework Library (hard and may take many hours)

Quick Install and Use Guide

Fastest way to get you ready to develop applications with Qt Framework (+ LCL Widgetset)

Qt4 Framework Library

First you need to download the Cocoa Mac binary package of Qt4 Framework Library from Nokia Qt download section or from a Trolltech mirror. The file you need is named something like qt-mac-opensource-4.7.4.dmg or with greater version.

  • Now Mount the disk image and install the package that you find inside.

Qt4 Interface Binary Bindings

Next you need to download the Interface Binary Bindings from Jan.Van.hijfte site, search for Mac: Libray Binary Intel, the file you download is named something like mac_bin-qt4pas-V2.4_Qt4.5.3.zip (don't worry about version in file name, it's indicating the lowest version required by Binaries).

  • After you click on the downloaded file it will be automatically unpacked and you will see another zip inside, unzip it too and install the package you find inside.
  • (Optional) Rename qt4.pas in qt45.pas and copy it inside /Developer/lazarus/lcl/interfaces/qt

Build Lazarus IDE on Qt

Lazarus 1.2/1.3 You must rebuild libQt4Pas library according to your needs (32/64bit). Build with make (from terminal):

  • 32bit (Carbon): make bigide LCL_PLATFORM=qt
  • 64bit (Cocoa): make bigide OS_TARGET=darwin CPU_PLATFORM=x86_64 LCL_PLATFORM=qt

Build from Lazarus IDE:

  • 32bit just set qt widgetset in ide build config dialog and rebuild.
  • 64bit set qt widgetset and add -Px86_64 -Tdarwin in ide build config dialog.IMPORTANT NOTE: you must build IDE with make first (from terminal), and then you can rebuild from IDE because of bug (dunno where it is) which causes linking of lazarus against 32bit objects.

Build Lazarus with qt-cocoa (qt binary distribution from nokia >= 4.7.4)

Qt binary distribution (>=4.7.4) is 64bit (cocoa only), so we need 64bit Qt4Pas and 64bit 2.6.0 compiler

  • Download and install fpc-2.6.0 (with 2.4.4 64bit you can compile lazarus etc but it will crash imediatelly).I've used "svn co http://svn.freepascal.org/svn/fpc/tags/release_2_6_0 fpc260" , then "fpcmake -Tall" , "make all", "sudo make install", "sudo make CPU_TARGET=x86_64 make install" (of course you need fpc-2.4.4 to build 2.6.0, you can download dmgs from lazarus daily snapshots.
  • Download qt-4.7.4 from nokia site (DO NOT DOWNLOAD 4.8.0 SINCE IT'S WRONGLY PACKAGED atm - won't work (missing symbols in QWebKit) https://bugreports.qt.nokia.com/browse/QTBUG-23157 )
  • Install qt
  • Download qt bindings source (Qt4Pas).
  • Open Qt4Pas.pro and comment CXXFLAGS += -mstackrealign (since it will be error with 64bit build on mac).
  • Build and install bindings as in readme.
  • dload lazarus trunk.

Build from terminal (short way)

  • make bigide CPU_TARGET=x86_64 LCL_PLATFORM=qt OPT="-k'-framework' -k'ApplicationServices'" (don't forget to change default compiler in Tools->Options->Compiler path)

Build carbon from terminal, then ide from ide

  • build it for carbon (32bit), startlazarus, go to Tools->Options, change cpu from /usr/local/bin/fpc to /usr/local/bin/ppcx64 in Compiler path (also fix source path to 2.6.0 if it isn't already fixed).
  • Tools->Configure Build Lazarus-> choose LCL widget type qt, in options write -k-framework -kApplicationServices (yes, without any quotes)
  • Build lazarus

Spotted problems

  • Qt-cocoa have problems with mouseGrabber (possible it's fixed in 4.8.0)
  • Cannot build pure cocoa widget set ATSUXXXX symbols are missing (probably need to pass more frameworks to linker)

Build environment

  • 10.6.8 (Snow Leopard)
  • XCode 3.(Don't know - but it's free one)

Build your first Qt Application

  • Note: Latest Lazarus IDE creates Application Bundles by himself when you create a new project, so you don't need to worry about this (while you leave the Create Application Bundle check box inside Project -> Project Options -> Application tab to it's default enabled state.
  1. Create a new project or use the default one that Lazarus IDE creates on first launch.
  2. Add some buttons and edit boxes to your form.
  3. Inside Project -> Project Options -> Compile Options -> Build modes click on empty macro line and choose LCLWidgetType, in relative macro value choose qt and click Ok.
  4. Now click green Run arrow and congratulate with yourself for building your first Qt Application.

Outdated Build Guide

Shebuka 17:03, 8 September 2011 (CEST) At this time, this part of guide can't be followed, because all shell script mentioned here to build Interface and Libraries are not present in Mac library sources.

Sections 2, 3, and 4 only need to be done if you are creating the Interface library, and Interface framework yourself. If you have installed the interface framework using Mac Library Binary (intel), you can start with section 5 and begin compiling the demo programs.

Notes on terminology:

These instructions generally use the term "Qt libraries" to describe the QtCore and QtGui libraries that are created in section 2. The term "interface library" is used to describe the Qt4Intf library created in section 3 that interfaces between Free Pascal and the Qt libraries. The "interface framework" is an macOS-specific folder created in section 4 that contains both the Qt libraries and interface library and can be linked against when compiling with Free Pascal.

If you're not familiar with macOS terms such as "framework" and "app bundle", refer to Apple's extensive online documentation.

Important! To run any of the scripts mentioned in sections 3-6, you may need to change its permission so that macOS will allow it to be executed:

 chmod +x script_name.sh

Install the Qt Library Frameworks

  • Download and install Qt4 from Trolltech/Nokia: [http:/ftp://ftp.trolltech.com/qt/source/]. The file will be named something like qt-mac-opensource-4.5.X.dmg.
  • Several Qt frameworks will be installed in /Library/Frameworks. QtCore.framework and QtGui.framework are used.

Creating the Qt interface library

A script file for doing this is included with Mac library source. The downloaded file will be named like mac_qt4pas-V1.XX_Qt4.4.X.zip Download and double-click this file to create folder qt4pas-V1.XX_Qt4.4.X.zip. Move this folder to your home folder and change to it (cd). Run the script as follows:

 ./compile_lib_mac.sh

This script will use the GCC g++ (installation of macOS DevSDK (Xcode) is required) compiler to compile qtpas.cpp and create Qt4Intf, the Qt interface library. If the script can't find the Qt4 library frameworks, it will output an error message. The script does not check the exact Qt version, use the appropriate Qt (Qt4.3.X cannot be mixed with Qt 4.4.X)

Creating the Qt interface framework

A script file for doing this is included with mac_qt4pas-1.xx.zip. Run the script as follows:

 sudo ./create_framework_mac.sh

This creates the Qt4Intf.framework folder under /Library/Frameworks. Note that sudo is required because of the need of write access in the /Library/Frameworks folder.

If the script can't find the Qt4Intf library it needs, it will output an error message. you need to compile it first (see step above)

Compiling the non-Lazarus demo programs with Free Pascal

The Pascal source for several demo programs is included in file mac_demos-1.xx.zip. Download and double-click this file to create folder demos-1.xx. Move this folder to your home folder (/Users/login) and change to it (cd).

To compile one of the demo programs:

 cd somedemo
 ../compile_exe_fr_mac.sh somedemo

This will compile the demo program with Free Pascal, creating an executable file with the same name.

Tip: The compile script uses the compiler option -Fu..(find units in parent directory) to only need a single copy for all demoes of the rather large Qt4.pas file.

Note that Lazarus is not required to compile these demo programs.

Creating a demo program application bundle

To create a double-clickable application on macOS, you need to create an app bundle. An app bundle is a folder with an .app extension in its name that looks like a file to the user. A script file is included for doing this:

 ../create_app_mac.sh somedemo

This creates the somedemo.app folder, as well as several folders and files inside it.

Note that this script does not copy the executable file into the app bundle the way you normally would when you're ready to distribute an app bundle. Instead, it creates a symbolic link inside the folder that points to the executable in the somedemo folder. This approach allows you to edit and compile a program as many times as necessary without needing to copy the executable file into the app bundle folder after each compile in order to run it.

In Finder, double-click the somedemo application (not the executable file) to launch it. You can also drag and drop the somedemo application onto the dock and launch it from there.

Creating a Qt based Lazarus

Starting purely from source

Note: The X11 package does not have to be installed at all.

  • Checkout svn source

in a terminal do

svn co http://svn.freepascal.org/svn/lazarus/trunk lazarus
  • Compile lazarus using installed Qt4Intf framework
  • adapt USE_QT_45 to the used Qt version
  • since svn >= 21913, Qt 4.5 is default, no need to define any USE_XX_YY when using Qt 4.5
cd lazarus
make clean all LCL_PLATFORM=qt OPT="-dUSE_QT_45 -k'-framework' -k'Qt4Intf' -k'-lobjc' -k'-framework' -k'Foundation'"
  • run lazarus :-)
./startlazarus

Starting from a Gtk based Lazarus

Currently Lazarus is only available for the X11-based GTK widgetset. The compiled LCL units included with Lazarus are only available for the GTK widgetset as well. The LCL units are also installed read-only, so the easiest way of compiling them for the Qt widgetset is simply to copy the LCL source to your home folder and rebuild it there. Here are the steps:

  • Copy the "lazarus" folder from /usr/local/share to your home folder (/Users/login).

Tip: How do you get to the Lazarus folder? In Finder, choose Go | Go to Folder and enter /usr, then navigate to /usr/local/share.

Tip: You can also use Subversion (SVN) to download the Lazarus source to a folder in your home folder (or someplace where you have write access to it).

Tip: For the purposes of these examples, you really only need to copy the Lazarus "lcl" folder, but you'll need to ignore the warnings that Lazarus gives you later on.

  • Make sure the Qt widgetset is using an up-to-date version of qt4.pas. Compare the version of qt4.pas file used in section 5 above with /Users/login/Lazarus/lcl/interfaces/qt/qt4.pas. The version should be indicated in a comment at the top of qt4.pas. If necessary, install a more recent version of Lazarus.
  • Start Lazarus by opening an X11 window and entering:
 cd /usr/local/share/lazarus
 ./lazarus
  • In Lazarus, choose Tools -> Options -> Environment. On the Files tab, change the Lazarus directory from /usr/local/share/lazarus to
 /Users/login/Lazarus

If you only copied the "lcl" folder, you'll get a warning when you click OK. Click Ignore to ignore the warning.

  • In Lazarus, choose Tools | Configure "Build Lazarus". Set Build LCL to "Build"; set all others to "None". Also click "qt" under LCL interface.
  • Click the Build button.
  • When Free Pascal is done compiling the LCL, check that you have newly created .ppu and .o files in /Users/login/Lazarus/lcl/units/powerpc-darwin/qt.
  • Choose Tools | Configure, restore the LCL interface setting to "gtk", then click "Save settings".

Creating an LCL app that uses the Qt widgetset

  • Create a new project in Lazarus. When you started Lazarus, it created a new project -- you can use this.
  • In Lazarus, choose Project | Compiler Options. On the Paths tab, select "qt" under LCL Widget Type.
  • On the Linking tab, select Pass Options To The Linker and enter
 -framework Qt4Intf -lobjc -framework Foundation

and click OK.

In the meantime qt widgetset becomes more mature, so you can see Lazarus Qt IDE under macOS

  • Save the project to a folder in your home folder (/Users/login).
  • In Lazarus, choose Run | Build to compile the project.

Tip: You can also compile your project from a script:

qtunits=~/lazarus/lcl/units/powerpc-darwin
/usr/local/bin/fpc -dLCL -WG -Sd -gl -O1 -Cirot -k'-framework' -k'Qt4Intf' -k'-lobjc' -Fu$qtunits -Fu$qtunits/qt myproj.lpr

You can change most of the switches as needed, but be sure to leave the -k switches alone. If necessary, change the first line to the path to the LCL units you created in the previous section.

  • Before running the app, make sure you've created an app bundle for it. You can copy the create_app_mac.sh script from section 6 to your project's folder and run it to create an app bundle for your compiled project.
  • To run the app, double-click the application (not the executable file) in Finder or drag it to the dock and launch it from there.

Distributing an app that uses the Qt Interface Framework

  • The Lazarus IDE creates a symbolic link inside the application bundle to the actual executable file. To copy the executable file into the application bundle in order to distribute it along with the application bundle, do this:
 cd /path/to/your/application/bundle
 rm MyApp.app/Contents/MacOS/MyApp
 cp -p MyApp MyApp.app/Contents/MacOS/MyApp

You should substitute the name of your application for "MyApp" above.

  • Consult Deploying Your Application#An Application Bundle for help with creating a distributable disk image file (.dmg extension) from your application bundle folder. Ignore the discussion of X11 and GTK since your app does not require them!

Uninstalling the Qt4 Interface and Qt4 Framework

  • If you need to remove the Qt4 Interface from your computer, simply drag the Qt4Pas.framework folder from /Library/Frameworks to the trash. Finder will prompt you for your password before allowing this.
  • If you need to remove the Qt4 Framework from your computer, simply drag the Qt3Support.framework and all QtXxxx.framework folders (like QtCore.framework, QtGui.framework, QtWebKit.framework ecc.) from /Library/Frameworks to the trash. Finder will prompt you for your password before allowing this.
  • (Optional) You can also drag Qt4 Free Pascal Interface.pkg (if present) from /Library/Receipts to the trash.