QSplitter继承自QFrame,但是无法在ui设计师界面直接拖出来,只能用代码来写。

 

但是我个人喜欢用设计师来拖放控件,所见即所得,不喜欢用代码来写界面,那么该怎么用设计师界面来设计分割器窗口呢?

我找了一个笨方法,原理步骤是这样的:
1、在打算用QSplitter的地方,先用任意一个容器类控件(QFrame、QWidget、QGroupBox等都可以)在ui中把地方占下;
2、把打算要显示在QSplitter中的各个控件都在这个临时容器控件中画好;
3、把这个临时容器放在一个layout(水平、垂直、网格均可)布局中。
4、在QMainWindow的构造函数中,用QLayout::replaceWidget(QWidget *from, QWidget *to)把临时控件给换成QSplitter
5、把临时容器控件中画好的各个控件都转到QSplitter里面来

 

图文详解步骤:

1、拖入一个临时容器控件QWidget,为了大家能看清楚,我给他设置了样式表(绿色边框)。然后把想要显示在QSplitter中的控件都画在临时容器QWidget里面,这里我画了3个控件:日历、编辑器、groupBox。

2、除了临时容器之外,还画了个TabWidget,然后给整个窗口设置了网格布局,如上图红色箭头所示。

3、添加代码:
 

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QSplitter * mainSplitter = new QSplitter(Qt::Horizontal);//新建水平分割器

//    mainSplitter->resize(600,300);//如果把分割器放置在layout中,那么就无需设置size

    QString style = QString("QSplitter::handle { background-color: rgb(179, 179, 179); }") //分割线的颜色
                    + QString("QSplitter {border: 2px solid green}");
    mainSplitter->setStyleSheet(style);
    mainSplitter->setHandleWidth(5);//分割线的宽度

    mainSplitter->setChildrenCollapsible(false);//不允许把分割出的子窗口拖小到0,最小值被限定为sizeHint或maxSize/minSize

    mainSplitter->addWidget(ui->calendarWidget);//把ui中拖出的各个控件拿走,放到分割器里面
    mainSplitter->addWidget(ui->textEdit);
    mainSplitter->addWidget(ui->groupBox);
//    mainSplitter->addWidget(new QLabel("QLabel"));//也可以在分割器里面新建控件

    this->centralWidget()->layout()->replaceWidget(ui->widget_1, mainSplitter);//把ui中拖出的容器QWidget换成分割器
    ui->widget_1->hide();
}

效果如下:

 

 

既然QSplitter继承自QFrame,那么他就可以直接作为一个独立窗口显示出来,我们仍然可以在ui中画好它的子控件,然后直接在新建的QSplitter中把画好的子控件拿进来。

上述代码的最后两行是把QSplitter替换进MainWindow的布局中的,我们把这两行注释掉,改为:
mainSplitter->show();

然后运行,结果如下,可以看到,QSplitter作为一个独立窗口显示出来了

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐