[英]Custom widget for Qt Application C++
我有2個使用Qt Designer創建的.ui文件
main_window.ui
-QMainWindow類(名稱為MyWindow),僅包含1個QTabWidget my_widget.ui
-QWidget(名稱為MyWidget)類,每個類均包含QLabel和QPushButton 我有一個配置文件,內容如下:
ProcessA Tab1; ProcessB Tab2; ProcessC Tab1
從上面可以清楚地看到,我需要A和C分別位於Tab1和B中。 我已經能夠創建所需的標簽。 我想創建第二個UI的實例並填充選項卡。
我已經能夠使用QPushButton類而不是MyWidget類,並獲得以下輸出(正確)
當我嘗試使用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.