Как мне получить доступ к элементам пользовательского интерфейса повышенного виджета в коде, используя Qt? - PullRequest
0 голосов
/ 16 мая 2018

Итак, я создал класс DemoPromotedWidget, он наследуется от QWidget.

Затем я создал виджет в конструкторе, добавил метку к указанному виджету с именем DemoLabel и продвинул виджет в класс DemoPromotedWidget ... Затем я переместил его в свою панель инструментов, и теперь он находится в "Scratchpad".

Обычно, используя конструктор Qt, я могу получить доступ к ЛЮБЫМ элементам в файле UI в соответствующем файле класса. Однако в DemoPromotedWidget я не могу.

Могу ли я в любом случае получить доступ к DemoLabel внутри DemoPromotedWidget, чтобы я мог вызвать что-то вроде ...

ui->DemoPromotedWidget->setText("Updated Text");

Вот изображение моего UI Designer с уже добавленным DemoPromotedWidget. https://i.imgur.com/QdT0eeG.png

DemoPromotedWidget.h

#ifndef DEMOPROMOTEDWIDGET_H
#define DEMOPROMOTEDWIDGET_H

#include <QWidget>

class DemoPromotedWidget : public QWidget
{
    Q_OBJECT
public:
    explicit DemoPromotedWidget(QWidget *parent = nullptr);

signals:

public slots:
};

#endif // DEMOPROMOTEDWIDGET_H

DemoPromotedWidget.cpp

#include "demopromotedwidget.h"

DemoPromotedWidget::DemoPromotedWidget(QWidget *parent) : QWidget(parent)
{
    // How do I access DemoPromotedWidget->DemoLabel->setText()?????????????????????
}

Вот мой mainwindow.ui ...

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>711</width>
    <height>418</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="DemoPromotedWidget" name="DemoPromotedWidget" native="true">
    <property name="geometry">
     <rect>
      <x>160</x>
      <y>60</y>
      <width>381</width>
      <height>191</height>
     </rect>
    </property>
    <property name="styleSheet">
     <string notr="true">background-color: black;
text-align: center;</string>
    </property>
    <widget class="QLabel" name="DemoLabel">
     <property name="geometry">
      <rect>
       <x>0</x>
       <y>5</y>
       <width>381</width>
       <height>181</height>
      </rect>
     </property>
     <property name="styleSheet">
      <string notr="true">color: white;
text-align: center;</string>
     </property>
     <property name="text">
      <string>DemoLabel</string>
     </property>
     <property name="alignment">
      <set>Qt::AlignCenter</set>
     </property>
    </widget>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>711</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <customwidgets>
  <customwidget>
   <class>DemoPromotedWidget</class>
   <extends>QWidget</extends>
   <header>demopromotedwidget.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

1 Ответ

0 голосов
/ 16 мая 2018

Не следует использовать имя класса с именем виджета, поэтому первое, что нужно сделать, это изменить его имя:

enter image description here

первый вариант:

С другой стороны, QLabel это внутри DemoPromotedWidget не означает, что DemoPromotedWidget может получить доступ к QLabel и меньше в конструкторе, поскольку в этом методе он еще не добавлен в главное окно, Возможное решение - создать атрибут, в котором вы можете присвоить ему QLabel:

demopromotedwidget.h

#ifndef DEMOPROMOTEDWIDGET_H
#define DEMOPROMOTEDWIDGET_H

#include <QLabel>
#include <QWidget>

class DemoPromotedWidget : public QWidget
{
    Q_OBJECT
public:
    explicit DemoPromotedWidget(QWidget *parent = nullptr);
    QLabel *getLabel() const;
    void setLabel(QLabel *value);
private:
    QLabel *label;
};

#endif // DEMOPROMOTEDWIDGET_H

demopromotedwidget.cpp

#include "demopromotedwidget.h"

DemoPromotedWidget::DemoPromotedWidget(QWidget *parent) : QWidget(parent)
{

}

QLabel *DemoPromotedWidget::getLabel() const
{
    return label;
}

void DemoPromotedWidget::setLabel(QLabel *value)
{
    label = value;
    if(label)
        label->setText("some text");
}

mainwindow.cpp

...
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->widget->setLabel(ui->DemoLabel);
}
...

второй вариант:

Еще один гораздо более простой способ, но это можно сделать, только если виджет (QLabel) добавлен с использованием Qt Designer, как в этом случае с использованием методов showEvent() и findChild():

demopromotedwidget.h

#ifndef DEMOPROMOTEDWIDGET_H
#define DEMOPROMOTEDWIDGET_H

#include <QLabel>
#include <QWidget>

class DemoPromotedWidget : public QWidget
{
    Q_OBJECT
public:
    explicit DemoPromotedWidget(QWidget *parent = nullptr);
private:
    QLabel *label;
protected:
    void showEvent(QShowEvent *event);
};

#endif // DEMOPROMOTEDWIDGET_H

demopromotedwidget.cpp

#include "demopromotedwidget.h"

DemoPromotedWidget::DemoPromotedWidget(QWidget *parent) : QWidget(parent)
{
}

void DemoPromotedWidget::showEvent(QShowEvent *event)
{
    label = findChild<QLabel *>("DemoLabel");
    if(label)
        label->setText("some text");
    QWidget::showEvent(event);
}

Обновление:

Новый подход состоит в том, что вы создаете форму, которая является QWidget и имеет .ui, .h и .cpp:

enter image description here

enter image description here

enter image description here

Как я уже сказал, создайте новый класс, который в отличие от вашего исходного кода имеет .ui, затем откройте его с помощью Qt Designer и добавьте метку

enter image description here

Но это также класс, который вы можете продвигать, как вы это делали при первом подходе.

enter image description here

Полный пример можно найти по следующей ссылке

...