C++ 创建非常相似的选项卡
编辑1:better title他们实现的任务似乎是多余的,因为我看到,您使用的不是两个单独的小部件添加两个选项卡,而是一个QStackedWidget,也就是说,在视觉上它是相同的。也许这是错误的,请您向我解释一下,如果不添加包含2个QListWidget和2个QpushButton的小部件,而是直接将其添加到QStackedWidget中,那么会有什么区别。您应该使用C++ 创建非常相似的选项卡,c++,qt,C++,Qt,编辑1:better title他们实现的任务似乎是多余的,因为我看到,您使用的不是两个单独的小部件添加两个选项卡,而是一个QStackedWidget,也就是说,在视觉上它是相同的。也许这是错误的,请您向我解释一下,如果不添加包含2个QListWidget和2个QpushButton的小部件,而是直接将其添加到QStackedWidget中,那么会有什么区别。您应该使用QListView而不是QListWidget,以便多个视图可以共享同一模型。那么您只需要更新一个模型。如有必要,您还可以使用
QListView
而不是QListWidget
,以便多个视图可以共享同一模型。那么您只需要更新一个模型。如有必要,您还可以使用代理模型为每个视图获得不同的排序和筛选行为。@eyllanesc我不确定是否理解您的问题。这个例子只是保留了我最初的想法,即使用QTabBar和QStackedWidget而不是QTabWidget来控制切换行为。如果编译并运行该示例,您将看到,如果单击选项卡1-3和选项卡4上的QPushButtons,左侧和右侧的实现都会切换到QListWidgets。两侧实现相同,但:-左侧相当复杂的连接/断开连接,空窗口小部件-右侧ugly@ekhumoro这是一个很好的建议,我会研究的!这将使我复杂的尝试过时,我只需在每个选项卡上添加必要的视图,并在模型中执行工作。他们实现的任务似乎是多余的,因为我看到,您使用的是QStackedWidget,而不是使用两个单独的小部件添加两个选项卡,也就是说,视觉上是相同的。也许这是错误的,请您向我解释一下,如果不添加包含2个QListWidget和2个QpushButton的小部件,而是直接将其添加到QStackedWidget中,那么会有什么区别。您应该使用QListView
而不是QListWidget
,以便多个视图可以共享同一模型。那么您只需要更新一个模型。如有必要,您还可以使用代理模型为每个视图获得不同的排序和筛选行为。@eyllanesc我不确定是否理解您的问题。这个例子只是保留了我最初的想法,即使用QTabBar和QStackedWidget而不是QTabWidget来控制切换行为。如果编译并运行该示例,您将看到,如果单击选项卡1-3和选项卡4上的QPushButtons,左侧和右侧的实现都会切换到QListWidgets。两侧实现相同,但:-左侧相当复杂的连接/断开连接,空窗口小部件-右侧ugly@ekhumoro这是一个很好的建议,我会研究的!这将使我复杂的尝试过时,我只需在每个选项卡上添加必要的视图,并在模型中进行工作。
#include <QApplication>
#include "mainwindow.h"
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MainWindow mw;
mw.show();
return app.exec();
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTabBar>
#include <QTabWidget>
#include <QStackedWidget>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
// constructor
explicit MainWindow(QWidget *parent = 0);
private:
void switchTab1(int index);
void switchTab2(int index);
QTabWidget *tabwidget1_;
QTabBar *tabwidget2_;
QStackedWidget *stack1_;
QStackedWidget *stack2_;
};
#endif // MAINWINDOW_H
#include <QListWidget>
#include <QPushButton>
#include <QLayout>
#include "mainwindow.h"
// constructor
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
//LEFT
QWidget *listTab1 = new QWidget;
QVBoxLayout *listTab1Layout = new QVBoxLayout;
listTab1Layout->addWidget(new QListWidget);
listTab1Layout->addWidget(new QListWidget);
listTab1->setLayout(listTab1Layout);
QWidget *buttonTab1 = new QWidget;
QVBoxLayout *buttonTab1Layout = new QVBoxLayout;
buttonTab1Layout->addWidget(new QPushButton);
buttonTab1Layout->addWidget(new QPushButton);
buttonTab1Layout->addStretch();
buttonTab1->setLayout(buttonTab1Layout);
tabwidget1_ = new QTabWidget;
tabwidget1_->addTab(listTab1,"tab1");
tabwidget1_->addTab(new QWidget,"tab2");
tabwidget1_->addTab(new QWidget,"tab3");
tabwidget1_->addTab(buttonTab1,"tab4");
// extracts the stacked widget, parentWidget() returns QObject,
// so it needs to be casted to QStackedWidget
stack1_ = qobject_cast<QStackedWidget*>(tabwidget1_->widget(0)->parentWidget());
// extract the tabbar
QTabBar *tabbar = tabwidget1_->tabBar();
// disconnects the switching of tabs, so I can implement my own function
disconnect(tabbar,&QTabBar::currentChanged,0,0);
// reconnect to manipulate the switching
connect(tabbar,&QTabBar::currentChanged,this,&MainWindow::switchTab1);
// RIGHT
QWidget *listTab2 = new QWidget;
QVBoxLayout *listTab2Layout = new QVBoxLayout;
listTab2Layout->addWidget(new QListWidget);
listTab2Layout->addWidget(new QListWidget);
listTab2->setLayout(listTab2Layout);
QWidget *buttonTab2 = new QWidget;
QVBoxLayout *buttonTab2Layout = new QVBoxLayout;
buttonTab2Layout->addWidget(new QPushButton);
buttonTab2Layout->addWidget(new QPushButton);
buttonTab2Layout->addStretch();
buttonTab2->setLayout(buttonTab2Layout);
tabwidget2_ = new QTabBar;
tabwidget2_->addTab("tab1");
tabwidget2_->addTab("tab2");
tabwidget2_->addTab("tab3");
tabwidget2_->addTab("tab4");
stack2_ = new QStackedWidget;
stack2_->addWidget(listTab2);
stack2_->addWidget(buttonTab2);
connect(tabwidget2_,&QTabBar::currentChanged,this,&MainWindow::switchTab2);
QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(tabwidget2_);
rightLayout->addWidget(stack2_);
// ADD TO MAIN
QWidget *mainWidget = new QWidget;
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addWidget(tabwidget1_);
mainLayout->addLayout(rightLayout);
mainWidget->setLayout(mainLayout);
setCentralWidget(mainWidget);
}
void MainWindow::switchTab1(int index)
{
// stack_->setCurrentIndex(index);
// return;
switch (index) {
case 0:
case 1:
case 2:
stack1_->setCurrentIndex(0);
break;
case 3:
stack1_->setCurrentIndex(3);
break;
}
emit tabwidget1_->currentChanged(index);
}
void MainWindow::switchTab2(int index)
{
// stack_->setCurrentIndex(index);
// return;
switch (index) {
case 0:
case 1:
case 2:
stack2_->setCurrentIndex(0);
break;
case 3:
stack2_->setCurrentIndex(1);
break;
}
}