Qt Application C ++的自定义小部件

时间:2017-05-29 17:38:35

标签: c++ qt qt4

我使用Qt Designer

创建了2个.ui文件
  1. main_window.ui - 只包含1个QTabWidget的QMainWindow(名称MyWindow)
  2. my_widget.ui - 包含QLabel和QPushButton的类QWidget(名称MyWidget)
  3. 我有一个类似这样的配置文件

      

    ProcessA Tab1; ProcessB Tab2; ProcessC Tab1

    从上面可以清楚地看出,我需要A和C在Tab2中的Tab1和B中。我已经能够创建所需的选项卡。我想创建第二个UI的实例并填充选项卡。

    我已经能够使用QPushButton类而不是MyWidget类并得到以下输出(这是正确的)

    QPushButton output

    当我尝试使用MyWidget类时,我最终得到空白标签。

    代码概述 -

    MyWindow::setupTabs(std::string fileName)
    {
      Read file
      for each process in file:
        MyWidget *temp = new MyWidget();
        Fill text in label and button
      Create std::vector<std::vector<MyWidget*> > and fill according to tabs 
      for each tab call populateTab()
    }
    
    MyWindow::populateTab(processList, tabName)
    {
      QFrame* group = new QFrame();
      QVBoxLayout* vbox = new QVBoxLayout();
      vbox->setSpacing(0);
      group->setLayout(vbox);
      QScrollArea* scrollArea = new QScrollArea();
      for (size_t i = 0; i < processList.size(); ++i)
        vbox->addWidget(processList[i]); //vbox->addWidget(new QPushButton); works fine
      scrollArea->setWidget(group);
      ui->tabWidget->addTab(scrollArea, tabName);
    }
    

    setupTabs函数完全按照需要执行,因此我非常简短地提到了代码。

    MyWidget.h看起来像这样

    namespace Ui {
    class MyWidget;
    }
    class MyWidget : public QWidget
    {
      Q_OBJECT
    public:
      explicit MyWidget(QWidget *parent = 0);
      ~MyWidget();
    private:
      Ui::MyWidget *ui;
    };
    

    请让我知道我做错了什么。

1 个答案:

答案 0 :(得分:1)

从您的伪代码中说出来有点难,但似乎您总是在布局中添加相同的小部件(MyWidget)。您的最后一个标签是否包含小部件,但其他标签不包含?

祝你好运

最小例子:

mainwindow.hpp

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_HPP

mainwindow.cpp(只是一个包含名为tabWidget的QTabWidget的QMainWindow)

#include "mainwindow.hpp"
#include "ui_mainwindow.h"
#include "form.hpp"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->tabWidget->clear(); // Clear the two Tabs that are shown by default
    QStringList fileEntries(QStringList() << "widget1" << "widget2" << "widget3" << "widget4"); // A QStringList simulating the file entries

    int count = 1;
    foreach (QString entry, fileEntries) { // Loop through all the entries and add the custom widget on the go
        Form *myWidget = new Form(this);
        myWidget->set(entry + "Label", entry + "Button");
        ui->tabWidget->addTab(myWidget, "New Tab " + QString::number(count++));
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

form.hpp(应该代表你的MyWidget)。它在QVBoxLayout中包含QLabel和QPushButton:

#ifndef FORM_HPP
#define FORM_HPP

#include <QWidget>

namespace Ui {
class Form;
}

class Form : public QWidget
{
   Q_OBJECT

public:
   explicit Form(QWidget *parent = 0);
   ~Form();

   void set(QString const&labelText, QString const&buttonText);

   private:
       Ui::Form *ui;
   };

   #endif // FORM_HPP

form.cpp:

#include "form.hpp"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
}

Form::~Form()
{
    delete ui;
}

void Form::set(const QString &labelText, const QString &buttonText)
{
    ui->label->setText(labelText);
    ui->pushButton->setText(buttonText);
}

form.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QLabel" name="label">
     <property name="text">
      <string>TextLabel</string>
     </property>
    </widget>
   </item>
   <item>
    <widget class="QPushButton" name="pushButton">
     <property name="text">
      <string>PushButton</string>
     </property>
    </widget>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections/>
</ui>

希望有所帮助,

祝你好运

第二次编辑,与上面的示例相同,但是form.ui在Form(QWidget)上没有布局(至少看起来像你的描述中的问题):

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>737</width>
    <height>523</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <widget class="QWidget" name="verticalLayoutWidget">
   <property name="geometry">
    <rect>
     <x>480</x>
     <y>350</y>
     <width>160</width>
     <height>80</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
    <item>
     <widget class="QLabel" name="label">
      <property name="text">
       <string>TextLabel</string>
      </property>
     </widget>
    </item>
    <item>
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>PushButton</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

祝你好运