Qt exec
-
MyDialog::MyDialog(QWidget *parent = nullptr) : QDialog(parent) {. When using open () you can connect to the finished () signal of QDialog to be notified when the dialog is closed. This caused only one window is open at the time. @JKSH It won't block the caller, but it will "block" the GUI thread. exec_(). In addition to the previous answer, not every time when all windows are closed does the GUI event loop, run by app. int QEventLoop:: exec ( QEventLoop::ProcessEventsFlags flags = AllEvents) Enters the main event loop and waits until exit () is called. #2. setTabOrder(c, d);// a to b to c to d. C++/Qt: crash Jul 14, 2015 · All windows are created with exampleWindow->exec(). Once started, the loop repeatedly checks for something to happen in the system, such as user-input through keyboard/mouse. By default, run () starts the event loop by calling exec () and runs a Qt event loop inside the thread. Apr 9, 2012 · Calling QCoreApplication::quit() is the same as calling QCoreApplication::exit(0). A menu widget is a selection menu. exec() starts a new loop and does not return until you close the window. An overview of the drag and drop system provided by Qt. The exec and show work in different ways and I am wondering how can I change the below code with using show() instead of exec(). Drag and drop is similar in function to the clipboard’s cut and paste mechanism. The QElapsedTimer class is usually used to quickly calculate how much time has elapsed between two events. db "VACUUM;" how can i do the same with QtSql module? Aug 30, 2012 · Qt calling QApplication::exec from library. The initial thread starts its event loop using QCoreApplication::exec(), or for single-dialog GUI applications, sometimes QDialog::exec(). Because, when I use the exec for windows (dialogs) I can not open another window. A single Qt Script function can act as both getter and setter for a property. The selected value is specified by value. If you don't call exec (), you need to create your own event loop that processes Qt events (that is, if you want signals / slots to work). Qt::DropAction QDrag:: defaultAction const. You need the object which create the dialog (or another one) to listen to the signals of the dialog. A dialog window is a top-level window mostly used for short-term tasks and brief communications with the user. The function is used similarly to QFileDialog::getOpenFileName (). Learn how to use QThread with worker objects, slots, signals, run (), exec (), and more. exec() to start up the event loop. Since Qt's SQL Module API is database-independent, all database-specific code is contained within these drivers. flag = 1; QApplication::quit(); Nov 17, 2011 · 39. Control passes to Qt until this function returns. edited Nov 19, 2021 at 18:25. Don't use them. h. When the user closes the dialog, exec() will provide a useful return value. Oct 4, 2012 · Is there a safe way to use Qt without calling QApplication::exec()? I have a number of different objects that are carrying out long-lived processes on multiple resources (at least one of them is communicating with a web application server). 2. But, Qt documentation is not a tutorial on how to use Qt. I have to convert these windows to non-modal dialog window. Alternatively, you can subclass your own database driver from QSqlDriver. If you look at the docs of the latter function: After this function has been called, the application leaves the main event loop and returns from the call to exec (). exe file exists (using cd command). Like QCoreApplication, QThread provides an exit(int) function and a quit() slot. Executing a Query. If the dialog is the application’s main widget, the application terminates. Jun 24, 2020 · import sys from PySide2. This is useful for inclusion in the Help menu of an application, as shown in the Menus example. argv) label = QLabel("Hello Qt for Python!") label. Usually your main looks like this: #include <QApplication>. ; It seems you are not taking full advantage of the signals and slots. ::show() won't block, but since it's sharing the event loop with your other code it isn't Explore the freedom of expression and writing on Zhihu's column platform, where ideas flow without constraints. after the user presses a button) you could use a QTimer::singleShot() which will call the function after the timer expires e. Jun 10, 2014 · Now the place where you write QTimer::singleShot(0, this, SLOT(doSomething())); might be inside some processing event. So in your case, ::exec() will fully render the dialog but it's blocking the rest of your background processing. Jul 2, 2015 · I've read up on the differences between execute(), start(), and startDetached() and to my understanding I want to use execute() because I want the process running the external executable to finish before continuing execution in the main process. show(); return a. Now, when we say event loop, does it mean that there is some while loop running in the internal code of Qt, and in that while loop The Query Model example shows how to make customized versions of data obtained from a SQL query, using a model that encapsulates the query and table views to display the results. QApplication. Those methods are "easy" to use, but that ease comes at a price of hard to track bugs. I had very very slow performance from the default Qt file browser dialog. The request may be ignored if the application prevents the quit, for example if one of its windows can't be closed. QThreadPool is a collection of reusable QThreads. exec_(), stop. また、OSによるUIもネイティブな物を使用している為OSに Nov 20, 2020 · Qt has the important requisite that any GUI-related objects (e. exe --quick . First you create a QProcess object and then call . However, the output of the new process is written tot the Application In multithreaded applications, you can use QTimer in any thread that has an event loop. Returns the drag cursor for the action. quit() inside any of the event handlers. myobject. [] QCoreApplication::exec() must also be called from that thread. Viewed 3k times 2 I am trying to make a simple login Nov 9, 2015 · QDialog::exec() blocks the main event loop, yes. Other threads can start an event loop using QThread::exec(). addAction(a) menu. To close the dialog and return the appropriate value, you must connect a default button, e. The QApplication object is accessible through the instance () function that returns a pointer equivalent to the global qApp pointer. QDialogs may be modal or modeless. Any data the new process writes to the console is forwarded to the calling process. Mar 4, 2013 · 2. The value is used by the QSettings class when it is constructed using the empty constructor. You should probably call one of these functions when you detect a QCloseEvent in your MyClass widget. command. show() only shows the window. exec_()) 위의 시작과 끝 사이에 QLabel오브잭트를 생성하고 Label을 붙여준 뒤에 오브잭트를 show 하고 종료할때 나오는 모습이다. It can be either a pull-down menu in a menu bar or a standalone context menu. The function returns the triggered QAction in either the popup menu or one of its submenus, or None if no item was triggered (normally because the user pressed Esc). This prevents a series of dangerous bugs from happening (e. Mar 10, 2014 · On OS X, it's rather simple to inject code into the main thread: dispatch_sync(dispatch_get_main_queue(), ^{ /* do stuff */ }); You can also run the Qt's event loop in that thread, since it runs the native event loop. Get and Install Qt with Command Line Interface describes how you can use Qt Online Installer with the command line interface. The QDialog class is the base class of dialog windows. In PyQt5 you can also use app. 在本文中,我们介绍了在PyQt应用程序中应该使用app. QDialog is the base class of dialog windows in Qt Widgets. For example, on the Windows platform, when the user logs off, the system terminates the process after Qt closes all top-level windows. Qt uses the timer's thread affinity to determine which thread will emit the timeout() signal. The default behavior is to quit when the last window (here MyClass) closes. Mar 8, 2017 · When QThread::exec() will read it, it will stop further processing of events, exit infinite loop and gently terminate the thread. Nov 30, 2016 · QApplication exec starts the main event loop. cfg"; QFile File(cfg_name); To scripts, the property looks and behaves just like a regular object property. getSaveFileName( self, 'Title', path, "", "", QtGui. Instead of setting up each pair manually like this: setTabOrder(a, b);// a to b. 2, released on 22 Sept 2000, introduced the QThread class. This is equivalent to: menu = QMenu() at = actions[0] // Assumes actions is not empty for a in actions: menu. Use QThread::exec() when you want to run the event loop Qt provides for you in the QThread class. python. When it detects such stimuli, it creates an instance of a QEvent and directs it at the QObject instance that’s at the top of May 8, 2016 · Usually, the "OK" button in a QDialog is connected to the QDialog::accept() slot. May 18, 2020 · If you only want the 2 second delay (e. Use signals/slots to communicate between the main thread (UI) and the QThread. By doing so, the various components that rely on a fully constructed application object will only be created once the event loop starts. – Idan K. First, a QApplication object is constructed, which can be configured with arguments passed in from the command line. Ask Question Asked 9 years, 4 months ago. See also exec(), QTimer, and QEventLoop::processEvents(). To start a drag, create a QDrag object, and call its exec() function. If you want to exit because you discovered file corruption then you may not want to exit with return code zero which means success, so you should call QCoreApplication::exit() because you can provide a non-zero The rest of the document focuses mainly on how to implement drag and drop in C++. 6. If not set, the application name defaults to the executable name (since 5. int main( int argc, char **argv ) Apr 7, 2019 · Qt (C++)はWindows・Mac OS・Ubuntuのプラットフォームに対応したフォームアプリケーション開発の移植性を解決し、同じソースで複数のプラットフォームに対応したアプリケーションを作る事が出来ます。. What's the event loop? Before getting the window on the screen, there are a few key concepts to introduce about how applications are organized in the Qt world. I'm writing an application that creates a QDialog subclass that includes an OpenGL display, and it crashes at the exec Jun 21, 2014 · The proper way to close the dialog and return from exec () is to call accept () or reject (). 4. #ifndef MYOBJECT_H #define MYOBJECT_H #include <QObject> class MyObject : public QObject { Q_OBJECT public: explicit MyObject(QObject *parent = 0); public slots: void sayHello(); }; #endif // MYOBJECT_H 这是因为exec_()方法使用了替代的名称,避免了与Python的内置exec函数冲突。 总结. Feb 2, 2015 · QT query. This document describes the basic drag and drop mechanism and outlines the Jul 8, 2015 · I want to convert exec usages to show method in my projects. For non-GUI Qt applications, use QCoreApplication instead, as it does not depend on the QtGui library. Over 90 percent of questions asked here gets answered. g. Because of this, you must start and stop the timer in its thread; it is not possible to start a Reimplements: QObject::event (QEvent *e). Nov 20, 2012 · 1. QtWidgets. It's a better idea to make your own code work Nov 11, 2020 · Using QProcess to execute external applications. See also exec(). show() sys. QThread Sep 17, 2010 · 14. 0. QApplication The program has unexpectedly finished. deleting the dialog's parent while the dialog is open via exec ()). As with close(), done() deletes the dialog if the Qt::WA_DeleteOnClose flag is set. file_path = QtGui. setTabOrder(b, c);// a to b to c. The "usual" method to do it is to create separate getters for the actual values. When it is called as a setter, the argument count is 1; the argument is the new value of the property. Pull-down menus are shown by the menu bar when the user clicks on the respective item or presses the specified shortcut key. An instance of QSqlDatabase represents the connection. Aug 7, 2020 · The exec() call really means "run arbitrary parts of my application, until an indeterminate time when the user decides they have had enough of the popup". Feb 9, 2017 · Initially, it is set to the current directory of the process which executed the application. Instead, write your own handler to set the return value: // Custom dialog's constructor. 3- Run windeployqt. an OK button to the accept() slot and a Cancel button to the reject() slot. That can be a source of nasty bugs: (Almost) anything can happen before exec() returns, external events (timers, network, IPC, whatever) can call slots, cause other Oct 4, 2014 · To answer your question about Qt, remember that bash(1), like all Posix shells, hence /bin/sh, accept the -c argument with a string (actually system(3) is forking a /bin/sh -c). exec(). In this example, we have chosen to show the menu using its exec() function. I'm making a GUI application that prompts the user for input at the right time for these different processes. This signal is only relevant when the input dialog is used in DoubleInput mode. // Initialize member variable widgets. QMYSQL query failing. Qt documentation is a very valuable piece of information. m_okButton = new QPushButton("OK", this); See also exec() and supportedActions(). e. If you want to do work on another thread, by all means create a QThread. 0). See also setDragCursor(). I'm using Qt 5. exec(); } 一般看到的都是用来直接在main函数中进行做返回使用,main函数中做函数返回值都是返回给系统的,所以就明白这个exec()的作用肯定跟系统处理有关。 可以看到main函数传入的两个参数直接被qt的QApplication的a对象进行了接受,这就是main函数开始就把控制权交给了QT了,中间定义一个w对象,并调用自身函数进行显示。 Oct 7, 2010 · 4. Using Qt Maintenance Tool. May 13, 2014 · sql. QTimer::singleShot(2000, this, &MainWindow::printResultFunction) Or you might use a local QEventLoop which you you will exec and then quit (again) using a timer e. You can use worker objects by moving them to the thread using QObject::moveToThread (). qt. Listing a directory took ~5s and selecting a file took ~3s. See also exec() and supportedActions(). If you want to terminate it manually you can use app. Oct 7, 2010 · Oct 7, 2010 at 10:34. Here sample code example of my project. If flags are specified, only events of the types allowed by the flags will be processed. QApplication::exec() must be called from the main thread. QThread is a platform-independent way to manage threads in Qt. In Apr 22, 2017 · The documentation says of QProcess::execute: Starts the program program with the arguments arguments in a new process, waits for it to finish, and then returns the exit code of the process. QPixmap QDrag:: dragCursor (Qt::DropAction action) const. The driver source code is supplied and can be used as a model for writing Sets the tab order for the widgets in the widgets list by calling QWidget::setTabOrder (QWidget *, QWidget *) for each consecutive pair of widgets. This function was introduced in Qt 5. After the widgets have been created and shown, QApplication::exec () is called to start Qt's event loop. This was a legacy feature avoid a clash with the exec reserved word in Python 2. The message includes the version number of Qt being used by the application. For using drag and drop inside a Qt Quick scene, please read the documentation for the Qt Quick Drag, DragEvent, and DropArea items, as well as the Qt Quick Drag and Drop examples. No loop is started so no events like painting are being processed. The QSqlDatabase class provides an interface for accessing a database through a connection. Use QMenuBar::addMenu () to insert a menu into a menu bar. When a thread becomes available, the code within QRunnable::run () will execute in that thread. ), and with the 4. This is almost certainly more work than it's worth, unless you have very specific needs. " Each thread can have its own event loop. Dec 20, 2016 · Reading the value returned by QApplication::exec() is related to the Qt infrastructure: Enters the main event loop and waits until exit () is called, then returns the value that was set to exit () (which is 0 if exit () is called via quit ()). exec_(pos, at) See also. The current directory can also be changed during the lifetime of the application process and is mostly used to resolve relative paths at run time. Example project @ code. It is a collection of all information related to classes, as well as some examples. exec()). Everything happens in an event loop and that loop calls event handlers. Drag and drop provides a simple visual mechanism which users can use to transfer information between and within applications. What you can do instead is periodically call QCoreApplication::processEvents(). It launches the GUI. 1. ". To actually invoke the menu, simply right click anywhere in the window. Learn how to create, display, and use modal or modeless dialogs with QDialog, and how to set default buttons, return values, and size grips. A lot of functionality in Qt depends on the event loop, and you will run into problems if you try and bypass it. For example: . Returns the value that was passed to exit (). Dec 26, 2020 · Unlike exec (), open () is asynchronous, and does not spin an additional event loop. Do these steps: 1- Open qt command-line window. It can be used to execute DML (data manipulation language) statements, such as SELECT, INSERT, UPDATE and DELETE, as well as DDL (data definition language) statements, such as CREATE TABLE. exit(app. What is the best way to process all the data and only execute once completed. exec()还是app. Qt Maintenance Tool is included in each Qt installation. Jul 1, 2011 · use QObject::startTimer(0) then reimplement QObject::timerEvent () to have the various components that rely on a fully constructed application object. new children are appended at the end. QtWidgets import * app = QApplication(sys. Qt now offers several classes for dealing with threads; let's start with an overview. It stops GUI event loop and launches your code after app. If the user presses Cancel, it returns an empty url. , QWidgets) operate in a single thread. QSqlQuery encapsulates the functionality involved in creating, navigating and retrieving data from SQL queries which are executed on a QSqlDatabase. Several drivers are supplied with Qt, and other drivers can be added. You need to keep in mind how Qt "works". Modified 9 years, 4 months ago. So just execute So just execute The most common way to display a modal dialog is to call its exec() function. The connection provides access to the database via one of the supported database drivers, which are derived from QSqlDriver. Oct 21, 2019 · 在qt中的main函数中大家总会看到一个exec ()函数的调用方式,一般存在于函数的最后一行用来作为返回使用。 eg1: int main(int argc,char * argv[]) { QApplication a(argc,argv); MainWindow w; w. Note that you must create the QApplication (or QCoreApplication) object before you can create a QThread. Once Qt is installed, you can use Qt Maintenance Tool under <install_dir> to add components and to update or remove installed components. You need to connect a slot with the clean up code to the QCoreApplication::aboutToQuit() signal. May 2, 2016 · I'm making a c++ application in Qt, and need to programmatically close a dialog window (opened with this->exec();) via code after a certain function finishes executing. Because of this, you must start and stop the timer in its thread; it is not possible to start a The most common way to display a modal dialog is to call its exec() function. You should exit from slot that is currently running. exec_()。这两个方法都用于运行应用程序的主事件循环,但exec_()提供了一个替代的名称,以避免与Python的内置exec函数 Sep 16, 2018 · Qt’s event loop starts the moment the underlying application’s exec() function gets called. First answer is a lot of words about nothing. Oct 18, 2007 · Qt Centre is a community site devoted to programming in C++ using the Qt framework. Context menus can be executed either asynchronously using the popup() function or synchronously using the exec() function. So in your code: QString cfg_name = QDir::currentPath() + "/config. You want to avoid this. If more than one statements are give, the function returns false. The Qt SQL module uses driver plugins to communicate with the different database APIs. Jul 16, 2021 · According to the Qt documentation for exec you have to call QApplication::exit(code) or QApplication::quit() for exec to return. Explore the insights and knowledge shared by experts and enthusiasts on Zhihu's specialized columns. When this loop is done, processEvents will be called again and in that the doSomething () will be executed. Apr 24, 2015 · QT query. I believed that this is not necessarily the main thread, but current documentation says "GUI classes, notably QWidget [] can only be used from the main thread. This function was introduced in Qt 6. Then, create an instance of the thread object and call QThread::start (). It doesn't block the UI though, as it opens a local event loop inside exec(), which processes events while the dialog is open. 4- Run your exe file and enjoy it! This video is great. QDialogs can also have a QSizeGrip in their lower-right corner, using Dec 7, 2015 · Main GUI thread operated by Qt QApplication::exec; TCP network thread operated by boost::asio::io_service; TCP events, such as connecting or receiving data cause changes in GUI. This function is a convenience slot for aboutQt() . From the documentation: Starting a Thread. Feb 25, 2016 · In summary, QDialog::exec() creates a modal dialog (regardless of your Qt::NonModal setting) with its own event loop, and ::show() does not. If it sounds nasty, then it's meant to: it's nasty, buggy, terrible way to develop UI code, and leads to bugs that are hard to debug, and allows you to procrastinate instead of spending time Qt for beginners — Finding information in the documentation. The QObjectList class is defined in the <QObject> header file as the following: typedefQList<QObject*>QObjectList; The first child added is the first object in the list and the last child added is the last object in the list, i. So this is like calling doSomething in the next event loop, rather than calling it immediately. 0. Most often, those are setText on QLabel and hiding various widgets. Those who are not familiar with Qt threading support yet or want to learn more, can participate in our online training This property holds the name of this application. ”. Adding the "DontUseNativeDialog" option fixed my problem completely. As to your actual question, the difference between popup () and exec Executing a Query. If you are using a C library that requires a 'shutdown' call you can normally do that after Oct 3, 2013 · If you want to do it with QThread rather than QtConcurrent then the following is a full, simple example:. In particular parent, caption, dir, filter, selectedFilter and options are used in the exact same way. Thanks in advance! Here is an example of my code, that doesn't work (Worker is the dialog Class): Aug 28, 2014 · Generally speaking, calling any exec is a bad idea, other than QCoreApplication::exec() or QDrag::exec(). The presence of exec() and waitForXxx() methods is an enticing trap for the unwary. When it is called as a getter, the argument count is 0. 2- Go to the directory which . Hence, there is no guarantee that the application will have time to exit its event loop and execute code at the end of the main() function, after the QApplication::exec() call. Finally, main() returns the value returned by QApplication::exec (). Detailed Description. QFileDialog. As readers may already know, Qt provides several multithreading constructs (threads, mutexes, wait conditions, etc. QDialogs can provide a return value, and they can have default buttons. ), and higher level APIs like QThreadPool, Qt Concurrent and other related classes. It is the place to find everything related to Qt. 1. Qt::DropAction QDrag:: exec (Qt::DropActions supportedActions = Qt::MoveAction) Starts the drag and drop operation and returns a value indicating the requested drop action when it is Nov 3, 2012 · Basically, when you run this example you'll get two checkboxes: when "Popup" is checked the context menu will be invoked with popup () and when "Exec_" is checked the menu is invoked with exec_ (). A QThread object manages one thread of control within the program. Sep 16, 2020 · Asynchronous APIs in Qt 6. Executing external programs is fairly straightforward with QProcess. with sqlite command line tool, i'd use the following command to do so: > sqlite3 file. void End_Page::restartProgram(){. Feb 24, 2016 · wrote on 24 Feb 2016, 08:42. Use QThreadPool::start () to put the QRunnable in the QThreadPool 's run queue. 2). g, the menubar at the top of the main screen on Mac OS X) 0. The exec () function returns returnCode. By passing the event's position as argument we ensure that the context menu appears at the expected position. Linux Qt application crashed in Qt libraries. If the event loop is not running, this function does May 21, 2019 · Finally, we call app. exec();} @ If I comment out all the sql commands it takes less than 1/2 seconds to go through this whole function parsing the json code, with the sql commands it takes 12-14 seconds which I think is terrible since there is only 60-70 elements being processed. As clearly stated in Qt Documentation for QSqlQuery::prepare () and QSqlQuery::exec (), For SQLite, the query string can contain only one statement at a time. Sep 18, 2012 · Some points : Rather than using setResult() yourself, use QDialog::accept() and QDialog::reject(). QThreads begin executing in run (). aboutQt() Displays a simple message box about Qt. Qt has had thread support for many years (Qt 2. This is the basic difference between exec() and show() method. However this is not recommended unless you're porting a non-Qt app. To put it very simple, QThread makes use of the application. Oct 7, 2010 at 12:33. Jul 27, 2010 · Re: QThread::exec and QApplication instantiation. DontUseNativeDialog ) Jun 8, 2021 · i need to create a new sqlite database. [static] double QInputDialog:: getDouble ( QWidget * parent, const QString & title, const QString & label, double value = 0, double min = -2147483647, double max = 2147483647, int decimals = 1, bool * ok = nullptr, Qt static PySide2. This is especially useful if your application depends on a specific bug fix introduced in a bug-fix release (for example, 6. Now, as you may guess, in order to receive termination message, two conditions must be met: You should be running `QThread::exec ()`. If this dialog is shown with exec(), done() also causes the local event loop to finish, and exec() to return r. To run code in one of a QThreadPool 's threads, reimplement QRunnable::run () and instantiate the subclassed QRunnable. You can use signal/slot as zibicoder suggested, but it's not very convenient. To execute an SQL statement, simply create a QSqlQuery object and call QSqlQuery::exec () like this: QSqlQuery query; query. This will terminate the exec with a return code of QDialog::Accepted or QDialog::Rejected. Returns the default proposed drop action for this drag operation. 7. Dragging. To start an event loop from a non-GUI thread, use QThread::exec(). io Detailed Description. QT_REQUIRE_VERSION (int argc, char **argv, const char *version) This macro can be used to ensure that the application is run with a recent enough version of Qt. exec("SELECT name, salary FROM employee WHERE salary > 50000"); The QSqlQuery constructor accepts an optional QSqlDatabase object that specifies which database connection to use. start() passing in the command to execute and a list of string arguments. Hot Network Questions What is the reason for using decibels to measure sound? As we can read in the documentation of QCoreApplication::quit() it "tells the application to exit with return code 0 (success). 0 release thread support is enabled by default on all supported platforms (although it can be turned off, see here for more details). However, unlike QTime, QElapsedTimer tries to use monotonic clocks if possible. you can call: This function was introduced in Qt 5. Currently, I am executing those actions in TCP client thread, which seems quite unsafe. [static slot] void QCoreApplication:: quit Asks the application to quit. It waits until exit is called and returns the value which was set in exit. You don't have to call app. This saves having to repeat this information each time a QSettings object is created. When the exec() is using the system is going into loop and wait for the user do something on the window. exec() returns always false. 6. If you are looking for information about Qt related issue — register and post your question. As you have already guessed the only known workaround to this limitation is having all the sql statements separated Mar 14, 2012 · to bypass the problem just call QCoreApplication::setAttribute (Qt::AA_DontUseNativeMenuBar) at the beginning of your program allowing to not use native menubar (e. In multithreaded applications, you can use QTimer in any thread that has an event loop. It processes the signals and calls appropriate slots on receiving them. a little bit of explanation: QObject::startTimer (int ms Jan 22, 2016 · The problem you have is caused by your wrong code: you call qApp->exit() before right in your constructor, where your application has not started it's message cycle yet (by a. This allows you to delete QObjects with QObject::deleteLater() and the objects will be deleted as you have not yet left the main application event loop. This is a convenience static function that returns an existing file selected by the user. Its API is similar to that of QTime, so code that was using that can be ported quickly to the new class. we hh pr dp dq qf od cl ed dj