代码之家  ›  专栏  ›  技术社区  ›  Rick

如何使用Qt访问代码中升级的小部件的UI元素?

  •  4
  • Rick  · 技术社区  · 6 年前

    所以我创建了一个DemoPromotedWidget类,它继承自QWidget。

    然后,我在designer中创建了一个小部件,在该小部件上添加了一个名为DemoLabel的标签;将小部件升级到DemoPromotedWidget类。。。然后我把它移到工具箱里,现在它在“草稿行”下。

    通常,使用Qt的设计器,我可以访问UI文件中相应类文件中的任何元素。然而,在DemoPromotedWidget中我不能。

    我是否可以访问DemoPromotedWidget中的DemoLabel,以便调用类似于。。。

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

    这是我的UI设计器的图片,已经添加了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()?????????????????????
    }
    

    这是我的主窗口。用户界面。。。

    <?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 回复  |  直到 6 年前
        1
  •  3
  •   eyllanesc    3 年前

    您不应该将类的名称与小部件的名称一起使用,因此首先要做的是更改其名称:

    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");
    }
    

    主窗口。cpp

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

    第二种选择:

    另一种简单得多的方法,但只有在使用Qt设计器添加小部件(QLabel)时才能实现,就像本例中使用的方法一样 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

    下面是完整的示例 link