Qt Private Slot Example

2021年4月23日
Register here: http://gg.gg/p50c3
Qt connects widgets by means of a nice designed scheme based on the idea that objectS may send signalS of different typeS to a single object instance: This is a screenshot of the example code running. ©2016 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. I’d like to move this code into functions/slots inside the private class, not vice versa (it already is in the public class); the problem isn’t accessing the public class from the private one. So currently I can attach lambdas but if I go with QPRIVATESLOT I’m stuck with the old connect syntax (as the private class isn’t a QObject derived).Home | All Classes | Main Classes | Annotated | Grouped Classes | Functions
Very basically, signals and slots in Qt allow communication between objects. In Qt, a signal is emitted when an event occurs. A slot is a function that is called when a signal is emitted. For example, a push button emits a clicked signal when clicked by a user. This private slot is used to move the shot while it is in the air, using a QTimer. Private: void paintShot( QPainter. ); This private function paints the shot. QRect shotRect const; This private function returns the shot’s enclosing rectangle if one is in the air; otherwise the returned rectangle is undefined.
In this example we introduce a timer to implement animated shooting.
*t11/lcdrange.h contains the LCDRangeclass definition.
*t11/lcdrange.cpp contains the LCDRangeimplementation.
*t11/cannon.h contains the CannonField classdefinition.
*t11/cannon.cpp contains the CannonFieldimplementation.
*t11/main.cpp contains MyWidget and main. Line-by-line Walkthrought11/cannon.h
The CannonField now has shooting capabilities.
Calling this slot will make the cannon shoot if a shot is not in the air.
This private slot is used to move the shot while it is in the air,using a QTimer.
This private function paints the shot.
This private function returns the shot’s enclosing rectangle ifone is in the air; otherwise the returned rectangle is undefined.
These private variables contain information that describes the shot. ThetimerCount keeps track of the time passed since the shot was fired.The shoot_ang is the cannon angle and shoot_f is the cannon forcewhen the shot was fired.t11/cannon.cpp
We include the math library because we need the sin() and cos() functions.
We initialize our new private variables and connect the QTimer::timeout() signal to our moveShot() slot. We’ll move theshot every time the timer times out.
This function shoots a shot unless a shot is in the air. The timerCountis reset to zero. The shoot_ang and shoot_f are set to the currentcannon angle and force. Finally, we start the timer.
moveShot() is the slot that moves the shot, called every 50milliseconds when the QTimer fires.
Its tasks are to compute the new position, repaint the screen with theshot in the new position, and if necessary, stop the timer.
First we make a QRegion that holds the old shotRect(). A QRegionis capable of holding any sort of region, and we’ll use it here tosimplify the painting. ShotRect() returns the rectangle where theshot is now - it is explained in detail later.
Then we increment the timerCount, which has the effect of moving theshot one step along its trajectory.
Next we fetch the new shot rectangle.
If the shot has moved beyond the right or bottom edge of the widget, westop the timer or we add the new shotRect() to the QRegion.
Finally, we repaint the QRegion. This will send a single paint eventfor just the one or two rectangles that need updating.
The paint event function has been split in two since the previouschapter. Now we fetch the bounding rectangle of the region thatneeds painting, check whether it intersects either the cannon and/orthe shot, and if necessary, call paintCannon() and/or paintShot().
This private function paints the shot by drawing a black filled rectangle.
We leave out the implementation of paintCannon(); it is the same asthe paintEvent() from the previous chapter.
This private function calculates the center point of the shot and returnsthe enclosing rectangle of the shot. It uses the initial cannon force andangle in addition to timerCount, which increases as time passes.
The formula used is the classical Newtonian formula for frictionlessmovement in a gravity field. For simplicity, we’ve chosen todisregard any Einsteinian effects.
We calculate the center point in a coordinate system where ycoordinates increase upward. After we have calculated the centerpoint, we construct a QRect with size 6x6 and move its center point tothe point calculated above. In the same operation we convert thepoint into the widget’s coordinate system (see TheCoordinate System).
The qRound() function is an inline function defined in qglobal.h (includedby all other Qt header files). qRound() rounds a double to the closestinteger.Qt Private Slot Example Valuet11/main.cpp
The only addition is the Shoot button.
In the constructor we create and set up the Shoot button exactly like wedid with the Quit button. Note that the first argument to the constructoris the button text, and the third is the widget’s name.
Connects the clicked() signal of the Shoot button to the shoot() slotof the CannonField. Behavior
The cannon can shoot, but there’s nothing to shoot at.
(See Compiling for how to create amakefile and build the application.) Exercises
Make the shot a filled circle. Hint: QPainter::drawEllipse() mayhelp.
Change the color of the cannon when a shot is in the air.
You’re now ready for Chapter 12.
[Previous tutorial][Next tutorial][Main tutorial page]
Nearly all of the code for the Application example is in the MainWindow class, which inherits QMainWindow. QMainWindow provides the framework for windows that have menus, toolbars, dock windows, and a status bar. The application provides File, Edit, and Help entries in the menu bar, with the following popup menus:
The status bar at the bottom of the main window shows a description of the menu item or toolbar button under the cursor.
To keep the example simple, recently opened files aren’t shown in the File menu, even though this feature is desired in 90% of applications. Furthermore, this example can only load one file at a time. The SDI and MDI examples show how to lift these restrictions and how to implement recently opened files handling.MainWindow Class Definition
Here’s the class definition:
The public API is restricted to the constructor. In the protected section, we reimplement QWidget::closeEvent() to detect when the user attempts to close the window, and warn the user about unsaved changes. In the private slots section, we declare slots that correspond to menu entries, as well as a mysterious documentWasModified() slot. Finally, in the private section of the class, we have various members that will be explained in due time.MainWindow Class Implementation
We start by including <QtWidgets>, a header file that contains the definition of all classes in the Qt Core, Qt GUI and Qt Widgets modules. This saves us from the trouble of having to include every class individually. We also include mainwindow.h.
You might wonder why we don’t include <QtWidgets> in mainwindow.h and be done with it. The reason is that including such a large header from another header file can rapidly degrade performances. Here, it wouldn’t do any harm, but it’s still generally a good idea to include only the header files that are strictly necessary from another header file.
In the constructor, we start by creating a QPlainTextEdit widget as a child of the main window (the this object). Then we call QMainWindow::setCentralWidget() to tell that this is going to be the widget that occupies the central area of the main window, between the toolbars and the status bar.
Then we call createActions() and createStatusBar(), two private functions that set up the user interface. After that, we call readSettings() to restore the user’s preferences.
We establish a signal-slot connection between the QPlainTextEdit’s document object and our documentWasModified() slot. Whenever the user modifies the text in the QPlainTextEdit, we want to update the title bar to show that the file was modified.
At the end, we set the window title using the private setCurrentFile() function. We’ll come back to this later.
When the user attempts to close the window, we call the private function maybeSave() to give the user the possibility to save pending changes. The function returns true if the user wants the application to close; otherwise, it returns false. In the first case, we save the user’s preferences to disk and accept the close event; in the second case, we ignore the close event, meaning that the application will stay up and running as if nothing happened.
The newFile() slot is invoked when the user selects File|New from the menu. We call maybeSave() to save any pending changes and if the user accepts to go on, we clear the QPlainTextEdit and call the private function setCurrentFile() to update the window title and clear the windowModified flag.
The open() slot is invoked when the user clicks File|Open. We pop up a QFileDialog asking the user to choose a file. If the user chooses a file (i.e., fileName is not an empty string), we call the private function loadFile() to actually load the file.Qt Private Slot Example For Real
The save() slot is invoked when the user clicks File|Save. If the user hasn’t provided a name for the file yet, we call saveAs(); otherwise, we call the private function saveFile() to actually save the file.
In saveAs(), we start by popping up a QFileDialog asking the user to provide a name. If the user clicks Cancel, the returned file name is empty, and we do nothing.
The application’s About box is done using one statement, using the QMessageBox::about() static function and relying on its support for an HTML subset.
The tr() call around the literal string marks the string for translation. It is a good habit to call tr() on all user-visible strings, in case you later decide to translate your application to other languages. The Internationalization with Qt overview covers tr() in more detail.
The documentWasModified() slot is invoked each time the text in the QPlainTextEdit changes because of user edits. We call QWidget::setWindowModified() to make the title bar show that the file was modified. How this is done varies on each platform.
The createActions() private function, which is called from the MainWindow constructor, creates QActions and populates the menus and two toolbars. The code is very repetitive, so we show only the actions corresponding to File|New, File|Open, and Help|About Qt.
A QAction is an object that represents one user action, such as saving a file or invoking a dialog. An action can be put in a QMenu or a QToolBar, or both, or in any other widget that reimplements QWidget::actionEvent().
An action has a text that is shown in the menu, an icon, a shortcut key, a tooltip, a status tip (shown in the status bar), a ’What’s This?’ text, and more. It emits a triggered() signal whenever the user invokes the action (e.g., by clicking the associated menu item or toolbar button).
Instances of QAction can be created by passing a parent QObject or by using one of the convenience functions of QMenu, QMenuBar or QToolBar. We create the actions that are in a menu as well as in a toolbar parented on the window to prevent ownership issues. For actions that are only in the menu, we use the convenience function QMenu::addAction(), which allows us to pass text, icon and the target object and its slot member function.
Creating toolbars is very similar to creating menus. The same actions that we put in the menus can be reused in the toolbars. After creating the action, we add it to the toolbar using QToolBar::addAction().
The code above contains one more idiom that must be explained. For some of the actions, we specify an icon as a QIcon to the QAction constructor. We use QIcon::fromTheme() to obtain the correct standard icon from the underlying window system. If that fails due to the platform not supporting it, we pass a file name as fallback. Here, the file name starts with :. Such file names aren’t ordinary file names, but rather path in the executable’s stored resources. We’ll come back to this when we review the application.qrc file that’s part of the project.
The Edit|Cut and Edit|Copy actions must be available only when the QPlainTextEdit contains selected text. We disable them by default and connect the QPlainTextEdit::copyAvailable() signal to the QAction::setEnabled() slot, ensuring that the actions are disabled when the text editor has no selection.
Just before we create the Help menu, we call QMenuBar::addSeparator(). This has no effect for most widget styles (e.g., Windows and macOS styles), but for some styles this makes sure that Help is pushed to the right side of the menu bar.
QMainWindow::statusBar() returns a pointer to the main window’s QStatusBar widget. Like with QMainWindow::menuBar(), the widget is automatically created the first time the function is called.
The readSettings() function is called from the constructor to load the user’s preferences and other application settings. The QSettings class provides a high-level interface for storing settings permanently on disk. On Windows, it uses the (in)famous Windows registry; on macOS, it uses the native XML-based CFPreferences API; on Unix/X11, it uses text files.
The QSettings constructor takes arguments that identify your company and the name of the product. This ensures that the settings for different applications are kept separately.
We use QSettings::value() to extract the value of the geometry setting. The second argument to QSettings::value() is optional and specifies a default value for the setting if there exists none. This value is used the first time the application is run.
We use QWidget::saveGeometry() and Widget::restoreGeometry() to save the position. They use an opaque QByteArray to store screen number, geometry and window state.
The writeSettings() function is called from closeEvent(). Writing settings is similar to reading them, except simpler. The arguments to the QSettings constructor must be the same as in readSettings().
The maybeSave() function is called to save pending changes. If there are pending changes, it pops up a QMessageBox giving the user to save the document. The options are QMessageBox::Yes, QMessageBox::No, and QMessageBox::Cancel. The Yes button is made the default button (the button that is invoked when the user presses Return) using the QMessageBox::Default flag; the Cancel button is made the escape button (the button that is invoked when the user presses Esc) using the QMessageBox::Escape flag.
The maybeSave() function returns true in all cases, except when the user clicks Cancel or saving the file fails. The caller must check the return value and stop whatever it was doing if the return value is false.
In loadFile(), we use QFile and QTextStream to read in the data. The QFile object provides access to the bytes stored in a file.
We start by opening the file in read-only mode. The QFile::Text flag indicates that the file is a text file, not a binary file. On Unix and macOS, this makes no difference, but on Windows, it ensures that the ’rn’ end-of-line sequence is converted to ’n’ when reading.
If we successfully opened the file, we use a QTextStream object to read in the data. QTextStream automatically converts the 8-bit data into a Unicode QString and supports various encodings. If no encoding is specified, QTextStream assumes the file is written using the system’s default 8-bit encoding (for example, Latin-1; see QTextCodec::codecForLocale() for details).
Since the call to QTextStream::readAll() might take some time, we set the cursor to be Qt::WaitCursor for the entire application while it goes on.
At the end, we call the private setCurrentFile() function, which we’ll cover in a moment, and we display the string ’File loaded’ in the status bar for 2 seconds (2000 milliseconds).
Saving a file is very similar to loading one. Here, the QFile::Text flag ensures that on Windows, ’n’ is converted into ’rn’ to conform to the Windows convension.
The setCurrentFile() function is called to reset the state of a few variables when a file is loaded or saved, or when the user starts editing a new file (in which case fileName is empty). We update the curFile variable, clear the QTextDocument::modified flag and the associated QWidget:windowModified flag, and update the window title to contain the new file name (or untitled.txt).
The strippedName() function call around curFile in the QWidget::setWindowTitle() call shortens the file name to exclude the path. Here’s the function:The main() Function
The main() function for this application is typical of applications that contain one main window:
The main function uses QCommandLineParser to check whether some file argument was passed to the application and loads it via MainWindow::loadFile().The Resource File
As you will probably recall, for some of the actions, we specified icons with file names starting with : and mentioned that such file names aren’t ordinary file names, but path in the executable’s stored resources. These resources are compiled
The resources associated with an application are specified in a .qrc file, an XML-based file format that lists files on the disk. Here’s the application.qrc file that’s used by the Application example:
The .png files listed in the application.qrc file are files that are part of the Application example’s source tree. Paths are relative to the directory where the application.qrc file is located (the mainwindows/application directory).
The resource file must be mentioned in the application.pro file so that qmake knows about it:
qmake will produce make rules to generate a file called qrc_application.cpp that is linked into the application. This file contains all the data for the images and other resources as static C++ arrays of compressed binary data. See The Qt Resource System for more information about resources.
Files:
Images:
Register here: http://gg.gg/p50c3

https://diarynote.indered.space

コメント

最新の日記 一覧

<<  2025年7月  >>
293012345
6789101112
13141516171819
20212223242526
272829303112

お気に入り日記の更新

テーマ別日記一覧

まだテーマがありません

この日記について

日記内を検索