在 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
中获得了第一页。这样就完成了。
我尝试使用BACK
和NEXT
按钮实现从一个选项卡到另一个选项卡的遍历。
我在一个小部件(名为 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
之后继承的吗? addTab
和 setCurrentWidget
也不是静态方法。
是的,TabWidget 继承了 QTabWidget。你能给我示例代码吗?
查看您的TabWidget::addTab
调用,您似乎在那里创建了一个静态方法(如果它编译的话)。这似乎很错误......如果它可以做任何有意义的事情,那么您的数据成员必须是静态的,这也是非常糟糕的设计(尽管只要您只有其中一个就可以工作)。请多研究 C++ OOP 的静态与非静态成员(方法和变量)。
我上面所说的另一种说法是,要在 Qt/C++ 中编码,您需要先学习 C++(除非您不需要需要异常,或者自己创建模板,或任何std
的东西,如std::string
或std::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 中创建选项卡的主要内容,如果未能解决你的问题,请参考以下文章