向右移动两个Qt标签,向左侧休息

Axi*_*iom 1 css c++ qt

我试图弄清楚如何从QtTabWidget向右移动两个标签,而将其余标签留在左边.

选项卡是静态的,不会在运行时添加.

这是我有的: 这是我到目前为止所拥有的

这是我想要的: 这就是我想要的

我已经尝试编辑样式表并添加,alignment:right;但这只是使所有这些都正确,并且不适用于特定的选项卡.我也尝试过这样的事情float,position:absolute;right:0;但没有运气.

我也在qt文档中找不到任何看起来像是帮助我的东西.

所以我的问题是:如何将"配置文件"选项卡和"设置"选项卡移到右侧,而将其余部分保留在原来的位置?

som*_*box 5

好吧,我认为你不能只用一个QTabWidget.首先,你确定你需要使用QTabWidget但不是QTabBar吗?

无论如何,你可以找到答案QSpacerItem两个 QTabBars.

  1. QTabBars用你的标签创建两个;
  2. 创造QHBoxLayout;
  3. 将第一个栏添加到此布局,然后QSpacerItem使用展开策略添加,然后添加最后一个栏;
  4. 当您点击任意栏时 - 您可以通过信号/插槽在屏幕上显示/隐藏您的小部件.

问题是 - 默认选择每个第一个栏QTabBar.它通过在每个上添加空标签来解决QTabBar.

一些示例代码:

_firstBar = new QTabBar(this);
_firstBar->addTab("");
_firstBar->addTab("First tab");
_firstBar->addTab("Second tab");
_firstBar->addTab("Third tab");
_firstBar->addTab("Fourth tab");
_firstBar->setDrawBase(false);
_firstBar->setStyleSheet("QTabBar::tab:first { max-width: 0px; border: 0px }");

_secondBar = new QTabBar(this);
_secondBar->addTab("");
_secondBar->addTab("Fifth bar");
_secondBar->addTab("Sixth bar");
_secondBar->setDrawBase(false);
_secondBar->setStyleSheet("QTabBar::tab:first { max-width: 0px; border: 0px }");

QHBoxLayout *lay = new QHBoxLayout(ui->centralWidget);
lay->addWidget(_firstBar);
lay->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed));
lay->addWidget(_secondBar);

connect(_firstBar, &QTabBar::currentChanged, this, &MainWindow::showFirstBarWidget);
connect(_secondBar, &QTabBar::currentChanged, this, &MainWindow::showSecondBarWidget);

_firstBar->setCurrentIndex(1);
Run Code Online (Sandbox Code Playgroud)

这里的插槽:

void MainWindow::showFirstBarWidget(int index)
{
    if(index == 0)
        return;

    _secondBar->setCurrentIndex(0);

    switch(index) {
        // Here code show/hide your QWidget by index
    }
}

void MainWindow::showSecondBarWidget(int index)
{
    if(index == 0)
        return;

    _firstBar->setCurrentIndex(0);

    switch(index) {
        // Here code show/hide your QWidget by index
    }
}
Run Code Online (Sandbox Code Playgroud)