在 Qt 中创建选项卡

Posted

技术标签:

【中文标题】在 Qt 中创建选项卡【英文标题】:Tab creation in Qt 【发布时间】:2014-01-17 21:56:11 【问题描述】:

我想在主窗口中单击按钮时动态创建一个新选项卡。让这个按钮成为新的。我在主窗口中放置了一个QWidget,我希望QTabWidget 可见。我添加了一个名为 TabWidget (QTabWidget) 的新表单,其中包含我的第一页设计。

我这样做了:

page1 = new TabWidget(ui->widget);  // TabWidget inherits QTabWidget
this->centralWidget()->layout()->addWidget(page1);

在我的QWidget 中获得了第一页。这样就完成了。

我尝试使用BACKNEXT 按钮实现从一个选项卡到另一个选项卡的遍历。

我在一个小部件(名为 form2)而不是 QTabWidget 中设计了第二个选项卡,我从我的第一个选项卡中调用了这个表单:

page2 = new Form2();   // Form2 contains the tab2 design
TabWidget::addTab(page2,"Scalar Parameters");  // Only this works, I couldn't use objects
TabWidget::setCurrentWidget(page2);

问题来了: 我不能对第三个标签做同样的事情。

page3 = new Form3();  // Form3 contains the tab3 design
TabWidget *t= new TabWidget();
t->addTab(page3,"Table Parameters");
t->setCurrentWidget(page3);

我在这里错过了什么?

我有这些文件,

大型机.h, tabwidget.h (inherits QTabWidget) 这也是我的第一个标签, tabwidget2.h(继承QWidget)第二个标签, tabwidget3.h(继承QWidget)第三个标签。

我在 mainframe.h 中包含了 tabwidget.h 并为它创建了一个对象 page1。因此,当在大型机上单击按钮时,我会这样做,

TabWidget *page1 = new TabWidget();
this->centralWidget()->layout()->addWidget(page1);

这会在大型机上创建一个包含我的设计的选项卡。这完美地工作。然后我在这个标签page1中有一个NEXT按钮。所以当我点击它时,我想在这个page1中添加一个新的标签page2。为此,我在 tabwidget.h 中包含了 tabwidget2.h 并创建了一个对象 page2。现在,当在我的 page1 中单击一个按钮时,我会这样做,

tabwidget2 *page2 = new tabwidget2();
tabwidget *t= new tabwidget();
t->addTab(page2,"Scalar Parameters");
t->setCurrentWidget(page2);

但这不起作用。所以我这样做了,

tabwidget2 *page2 = new tabwidget2(t);
tabwidget::addTab(page2,"Scalar Parameters");
tabwidget::setCurrentWidget(page2);

这很有效,我将第二页添加到了我的第一个标签中。当我从第 2 页单击“下一步”按钮时添加第 3 页时出现问题。我这样做了,

tabwidget3 *page3 = new tabwidget3();
tabWidget *t= new tabWidget();
t->addTab(page3,"Table Parameters");
t->setCurrentWidget(page3);

并没有工作。程序编译没有任何错误。 大型机 ->(新按钮)-> page1(这是一个QTabWidget 显示在大型机上的小部件上)->(NEXT 按钮)-> page2(QWidget 作为新选项卡添加到 page1)->(NEXT 按钮) -> 什么都没发生

我已尽力解释这一点。请帮帮我。

代码: mainframe.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

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


namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

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

private slots:
     void on_action_About_triggered();

     void on_action_New_triggered();

private:
     Ui::MainWindow *ui;
;

Tabwidget.h

#ifndef TABWIDGET_H
#define TABWIDGET_H

#include <QTabWidget>
#include "tabwidget2.h"

namespace Ui 
class TabWidget;


class TabWidget : public QTabWidget

     Q_OBJECT

public:
    explicit TabWidget(QWidget *parent = 0);
    ~TabWidget();
    tabwidget2 *page2;

private slots:
    void on_pushButton_6_clicked();

private:
    Ui::TabWidget *ui;
;

#endif // TABWIDGET_H

tabwidget2.h

#ifndef TABWIDGET2_H
#define TABWIDGET2_H

#include <QWidget>
#include "tabwidget3.h"


namespace Ui 
class tabwidget2;


class tabwidget2 : public QWidget

   Q_OBJECT

public:
   explicit tabwidget2(QWidget *parent = 0);
   ~tabwidget2();
   tabwidget3 *page3;

private slots:
   void on_pushButton_2_clicked();

private:
   Ui::tabwidget2 *ui;
;

#endif // TABWIDGET2_H

mainframe.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QtWidgets"
#include "qtabwidget.h"
#include "qdialog.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

     ui->setupUi(this);


MainWindow::~MainWindow()

    delete ui;


void MainWindow::on_action_New_triggered()

   TabWidget *page1 = new TabWidget();
   this->centralWidget()->layout()->addWidget(page1);

tabwidget.cpp

#include "tabwidget.h"
#include "ui_tabwidget.h"

TabWidget::TabWidget(QWidget *parent) :
  QTabWidget(parent),
  ui(new Ui::TabWidget)

    ui->setupUi(this);
 

TabWidget::~TabWidget()

    delete ui;
 

void TabWidget::on_pushButton_6_clicked()

    tabwidget2 *page2 = new tabwidget2();
    this->addTab(page2,"Scalar Parameters");
    this->setCurrentWidget(page2);
 

tabwidget2.cpp

#include "tabwidget2.h"
#include "ui_tabwidget2.h"
#include "tabwidget.h"

tabwidget2::tabwidget2(QWidget *parent) :
QWidget(parent),
ui(new Ui::tabwidget2)

    ui->setupUi(this);


tabwidget2::~tabwidget2()

    delete ui;


void tabwidget2::on_pushButton_2_clicked()


    tabwidget3 *page3 = new tabwidget3();
    TabWidget *t= new TabWidget();
    t->addTab(page3,"Table Parameters");
    t->setCurrentWidget(page3);

我只是无法导入我的第 3 页。

【问题讨论】:

TabWidget 类是什么?它是在QTabWidget 之后继承的吗? addTabsetCurrentWidget 也不是静态方法。 是的,TabWidget 继承了 QTabWidget。你能给我示例代码吗? 查看您的TabWidget::addTab 调用,您似乎在那里创建了一个静态方法(如果它编译的话)。这似乎很错误......如果它可以做任何有意义的事情,那么您的数据成员必须是静态的,这也是非常糟糕的设计(尽管只要您只有其中一个就可以工作)。请多研究 C++ OOP 的静态与非静态成员(方法和变量)。 我上面所说的另一种说法是,要在 Qt/C++ 中编码,您需要先学习 C++(除非您不需要需要异常,或者自己创建模板,或任何std 的东西,如std::stringstd::cout)。在不了解静态与非静态方法这样基本的东西的情况下跳入 Qt 小部件编程将是……痛苦的。 我认为我没有在任何地方使用过静态成员。我已经发布了我的代码。 【参考方案1】:

您的代码中有一些错误。这是您将标签添加到QTabWidget

的方式
QTabWidget *tabwidget = new QTabWidget(ui->centralWidget);
tabwidget->setObjectName(QString("tabbar"));

QWidget *tab = new QWidget();
tabwidget->addTab(tab, "tab1");

QWidget *tab2 = new QWidget();
tabwidget->addTab(tab2, "tab2");
tabwidget->setCurrentWidget(tab2);
// etc.

所以在你的情况下,它可能是:

page1 = new TabWidget(ui->centralWidget);

page2 = new Form2();
page1->addTab(page2, "Scalar Parameters");
page1->setCurrentWidget(page2);

page3 = new Form3();
page1->addTab(page3, "Table Parameters");
page1->setCurrentWidget(page3);

您必须将选项卡(您的 Form 类)添加到 QTabWidget,这意味着将它们添加到 page1 对象。

如果您想从无法访问page1 的地方添加选项卡,我会将 ObjectName 添加到 page1,以便您稍后搜索。

TabWidget *page1 = new TabWidget();
this->centralWidget()->layout()->addWidget(page1);
page1->setObjectName("TabWidget"); //name it whatever you want

然后在添加新标签时:

tabwidget3 *page = new tabwidget3()
TabWidget *temporary = ui->centralWidget->findChild<TabWidget *>("TabWidget");
temporary->addTab(page3, "name");
temoprary->setCurrentWidget(page3);

不要创建新的TabWidget。 QTabWidget 就像一个标签的容器,如果你想添加一个标签,你必须将它添加到现有的。

【讨论】:

感谢您的详细解答,仍然无法得到它。我已经更好地重新构建了我的问题。请看一下。 它说 TabWidget 没有名为 centralwidget 的成员。请多多包涵。我对此真的很陌生。 @user3188471 你必须从你的课程中发布一些代码,否则我不知道问题是什么。至少发生错误的那一行 @user3188471 看看我的帖子的第二部分,带有setObjectName 的那个你必须在添加时对page1 执行此操作,而不是在添加page3 时执行findChild (不是我写的两个),我会马上编辑我的答案 H:\Qt\Tools\QtCreator\bin\basinwindow\tabwidget2.cpp:22: 错误:'class Ui::tabwidget2' 没有名为 'centralWidget' 的成员 ^

以上是关于在 Qt 中创建选项卡的主要内容,如果未能解决你的问题,请参考以下文章

问题更改选项卡 QTabWidget & QScrollArea Qt

Pyqt:在 QtDesigner 中创建选项卡

如何在片段中创建选项卡的示例?

如何在 Java 中创建垂直选项卡?

以编程方式在 Markdown 中创建选项卡和绘图

在 ViewController 中创建选项卡视图的最佳方法是啥