[Development] About ALIAS in Q_PROPERTY
Svetkin Mikhail
mikhail.svetkin at gmail.com
Tue Mar 11 10:57:57 CET 2014
>
> Try initializing that `ui` with 0 and see what happens.
For this, in moc(for ALIAS) can add a check
Q_PROPERTY(QString label ALIAS AnyCrap m_parent->labelWidget->objectName())
This example not valid.
Q_PROPERTY(QString label ALIAS AnyCrap m_parent->labelWidget->propertyName).
Where `propertyName` link on Q_PROPERTY(type propertyName)
If the syntax is very complex, it is possible to do so
Q_PROPERTY(QString label ALIAS AnyCrap m_parent->labelWidget propertyName).
2014-03-11 15:12 GMT+06:00 Konstantin Ritt <ritt.ks at gmail.com>:
> Try initializing that `ui` with 0 and see what happens.
>
> Similar for using the property from a destructor or destruction sequence,
> since moc is unable to track the pointers in use.
> Also think about objects you don't control, i.e. Q_PROPERTY(QString label
> ALIAS AnyCrap m_parent->labelWidget->objectName()) ...and so on.
>
> Regards,
> Konstantin
>
>
> 2014-03-11 10:59 GMT+02:00 Svetkin Mikhail <mikhail.svetkin at gmail.com>:
>
> Why do you think moc will crash?
>>
>>
>> 2014-03-11 14:30 GMT+06:00 Konstantin Ritt <ritt.ks at gmail.com>:
>>
>>> > Would suggest to solve this problem in this way(The code marked as
>>> duplicate does not need anymore.):
>>> > Q_PROPERTY(QString <http://qt-project.org/doc/QString.html> label
>>> ALIAS CustomWidgetFirst ui->custom_widget_first_obj->value ) // where
>>> "value" property name
>>>
>>> I don't think moc is able to guarantee no crash at
>>> `ui->custom_widget_first_obj->value`. So you're trading safety for nothing.
>>>
>>> Konstantin
>>>
>>>
>>> 2014-03-11 5:12 GMT+02:00 Svetkin Mikhail <mikhail.svetkin at gmail.com>:
>>>
>>> Explain:
>>>> I was creating custom widgets with the help of Qt-designer.
>>>> And I have noticed I have to duplicate my code, if I want to edit
>>>> properties of the widget in qt-designer property editor.
>>>> Simple Example:
>>>>
>>>>
>>>> 1. // custom_widget_first.h
>>>> 2.
>>>> 3. #include <QWidget>
>>>> 4. #include <QString>
>>>> 5. #include <QPaintEvent>
>>>> 6.
>>>> 7. class CustomWidgetFirst : public QWidget<http://qt-project.org/doc/QWidget.html>
>>>> {
>>>> 8. Q_OBJECT
>>>> 9. Q_PROPERTY(QString <http://qt-project.org/doc/QString.html> value
>>>> READ label WRITE setLabel)
>>>> 10. public:
>>>> 11. explicit CustomWidgetFirst(QWidget<http://qt-project.org/doc/QWidget.html>
>>>> *parent = 0)
>>>> 12. ~CustomWidgetFirst();
>>>> 13.
>>>> 14. QString <http://qt-project.org/doc/QString.html> label() const
>>>> ;
>>>> 15. void setLabel(const QString<http://qt-project.org/doc/QString.html>
>>>> &label);
>>>> 16.
>>>> 17. protected:
>>>> 18. void paintEvent(QPaintEvent<http://qt-project.org/doc/QPaintEvent.html>
>>>> *event);
>>>> 19.
>>>> 20. private:
>>>> 21. QString <http://qt-project.org/doc/QString.html> m_label;
>>>> 22. };
>>>> 23.
>>>> 24. // custom_widget_first.cpp
>>>> 25.
>>>> 26. #include "custom_widget_first.h"
>>>> 27.
>>>> 28. CustomWidgetFirst::CustomWidgetFirst(QWidget<http://qt-project.org/doc/QWidget.html>
>>>> *parent)
>>>> 29. : QWidget <http://qt-project.org/doc/QWidget.html>(parent) {
>>>> 30. }
>>>> 31.
>>>> 32. QString <http://qt-project.org/doc/QString.html>
>>>> CustomWidgetFirst::label() const {
>>>> 33. return m_label;
>>>> 34. }
>>>> 35.
>>>> 36. void CustomWidgetFirst::setLabel(const QString<http://qt-project.org/doc/QString.html>
>>>> &label) {
>>>> 37. m_label = label;
>>>> 38. }
>>>> 39.
>>>> 40. void CustomWidgetFirst::paintEvent(QPaintEvent<http://qt-project.org/doc/QPaintEvent.html>
>>>> *event) {
>>>> 41. // some paint
>>>> 42. }
>>>> 43.
>>>> 44. CustomWidgetFirst::~CustomWidgetFirst() {
>>>> 45. }
>>>> 46.
>>>> 47. // custom_widget_second.h
>>>> 48.
>>>> 49. #include <QWidget>
>>>> 50. #include <QString>
>>>> 51.
>>>> 52. namespace Ui {
>>>> 53. class Form;
>>>> 54. }
>>>> 55.
>>>> 56. class CustomWidgetSecond : public QWidget<http://qt-project.org/doc/QWidget.html>
>>>> {
>>>> 57. Q_OBJECT
>>>> 58. Q_PROPERTY(QString <http://qt-project.org/doc/QString.html>
>>>> text
>>>> 59. READ getUiCustomWidgetSecondTextLabel
>>>> 60. WRITE setUiCustomWidgetSecondTextLabel)
>>>> 61.
>>>> 62. public:
>>>> 63. explicit CustomWidgetSecond(QWidget<http://qt-project.org/doc/QWidget.html>
>>>> *parent = 0)
>>>> 64. ~CustomWidgetSecond();
>>>> 65.
>>>> 66. QString <http://qt-project.org/doc/QString.html>
>>>> getUiCustomWidgetFirstLabel() const; // dublicate
>>>> code
>>>> 67. void setUiCustomWidgetFirstTextLabel(const QString<http://qt-project.org/doc/QString.html>
>>>> &text); // dublicate code
>>>> 68.
>>>> 69. private:
>>>> 70. Ui::Form *ui; // ui generated from uic and have several
>>>> widgets, including CustomWidgetFirst
>>>> 71. };
>>>> 72.
>>>> 73. // custom_widget_second.cpp
>>>> 74.
>>>> 75. #include "custom_widget_second.h"
>>>> 76. #include "ui_form.h"
>>>> 77.
>>>> 78. CustomWidgetSecond::CustomWidgetSecond(QWidget<http://qt-project.org/doc/QWidget.html>
>>>> *parent)
>>>> 79. : QWidget <http://qt-project.org/doc/QWidget.html>(parent),
>>>> 80. ui(new Ui::Form) {
>>>> 81. ui->setupUi(this);
>>>> 82. }
>>>> 83.
>>>> 84. QString <http://qt-project.org/doc/QString.html>
>>>> CustomWidgetSecond::getUiCustomWidgetFirstTextLabel() const { //
>>>> duplicate code
>>>> 85. return ui->CustomWidgetFirst->label();
>>>> // duplicate code
>>>> 86. }
>>>> // duplicate code
>>>> 87.
>>>> 88. void CustomWidgetSecond::setUiCustomWidgetFirstTextLabel(const
>>>> QString <http://qt-project.org/doc/QString.html> &text) { //
>>>> duplicate code
>>>> 89. ui->CustomWidgetFirst->setLabel(text);
>>>> // duplicate code
>>>> 90. }
>>>> // duplicate code
>>>> 91.
>>>> 92. CustomWidgetSecond::~CustomWidgetSecond() {
>>>> 93. delete ui;
>>>> 94. }
>>>>
>>>>
>>>> Would suggest to solve this problem in this way(The code marked as
>>>> duplicate does not need anymore.):
>>>>
>>>> 1. Q_PROPERTY(QString <http://qt-project.org/doc/QString.html> label
>>>> ALIAS CustomWidgetFirst ui->custom_widget_first_obj->value ) //
>>>> where "value" property name
>>>>
>>>> The ALIAS attribute indicates that the property will be reference on
>>>> another
>>>> property. If ALIAS property has a signal, you need to declare the same
>>>> signal
>>>> because moc will automatically generate connect(aliasObject,
>>>> aliasSignal, yourClassObject, aliasSignal)
>>>> and you will only need call initAliasNotify function in the class
>>>> construct.
>>>>
>>>>
>>>> 2014-03-10 22:43 GMT+06:00 Giuseppe D'Angelo <dangelog at gmail.com>:
>>>>
>>>> Can you please explain what this feature is about, why do you think
>>>>> it's useful, how it's supposed to be used, etc.?
>>>>>
>>>>> On 10 March 2014 17:30, mikhail.svetkin at gmail.com
>>>>> <mikhail.svetkin at gmail.com> wrote:
>>>>> > Hello, I would like to clarify wherein the complexity
>>>>> > (https://codereview.qt-project.org/#change,80412)?
>>>>> > Ready to listen to any suggestions and implement them.
>>>>> >
>>>>> > --
>>>>> > Mikhail Svetkin
>>>>> > _______________________________________________
>>>>> > Development mailing list
>>>>> > Development at qt-project.org
>>>>> > http://lists.qt-project.org/mailman/listinfo/development
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Giuseppe D'Angelo
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Development mailing list
>>>> Development at qt-project.org
>>>> http://lists.qt-project.org/mailman/listinfo/development
>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20140311/955bc081/attachment.html>
More information about the Development
mailing list