将LineEdit和Label组合到自定义小部件中

时间:2018-11-06 22:04:31

标签: qt qt5

我试图将QLabel和QLineEdit组合到自定义小部件中,以便可以将它们都插入QTreeWidgetItem中。我已经创建了该类,但是找不到在MainWindow中实际显示它的方法。

customwidget.h

#ifndef CUSTOMWIDGET_H
#define CUSTOMWIDGET_H

#include <QLineEdit>
#include <QLabel>
#include <QListWidget>

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

signals:

public slots:

private:
  QLabel *label;
  QLineEdit *edit;
};

#endif // CUSTOMWIDGET_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "customwidget.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    customwidget* widget = new customwidget;

};

#endif // MAINWINDOW_H

customwidget.cpp

#include "customwidget.h"

customwidget::customwidget(QWidget *parent) : QWidget(parent)
{
        label = new QLabel;
        edit = new QLineEdit;
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "customwidget.h"

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

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

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>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget"/>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>400</width>
     <height>22</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"/>
 <resources/>
 <connections/>
</ui>

如何在UI中实际包含此小部件?

1 个答案:

答案 0 :(得分:0)

要显示小部件,您需要将其设置为主窗口的中央小部件:请参见http://doc.qt.io/qt-5/qmainwindow.html#setCentralWidget

我在您的代码中还看到了其他两个问题:

创建自定义窗口小部件时,无法在头文件中执行此操作。在主窗口的构造函数中完成

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
   widget = new customwidget(this);
   setCentralWidget(widget);
}

在自定义小部件中,您需要设置布局,以告诉Qt两个子小部件的位置。例如,如果您希望它们并排放置:

customwidget::customwidget(QWidget *parent) : QWidget(parent)
{
    label = new QLabel(this);
    edit = new QLineEdit(this);
    QHBoxLayout *layout = new QHBoxLayout(this);
    layout->addItem(label);
    layout->addItem(edit);
    this->setLayout(layout);
}

而且-当您将小部件作为子级创建时,请始终将其传递给父级,这意味着在删除父级时会对其进行清理。