簡體   English   中英

Qt應用程序C ++的自定義小部件

[英]Custom widget for Qt Application C++

我有2個使用Qt Designer創建的.ui文件

  1. main_window.ui -QMainWindow類(名稱為MyWindow),僅包含1個QTabWidget
  2. my_widget.ui -QWidget(名稱為MyWidget)類,每個類均包含QLabel和QPushButton

我有一個配置文件,內容如下:

ProcessA Tab1; ProcessB Tab2; ProcessC Tab1

從上面可以清楚地看到,我需要A和C分別位於Tab1和B中。 我已經能夠創建所需的標簽。 我想創建第二個UI的實例並填充選項卡。

我已經能夠使用QPushButton類而不是MyWidget類,並獲得以下輸出(正確)

QPushButton輸出

當我嘗試使用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;
};

請讓我知道我在做什么錯。

從偽代碼很難分辨,但是似乎總是在向布局添加相同的小部件(MyWidget)。 您的最后一個標簽中是否包含小部件,而其他標簽中沒有?

最好的祝福


最小示例:

主窗口

#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(只是一個QMainWindow,其中包含一個名為tabWidget的QTabWidget)

#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>

最好的祝福

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM