QSplitter在QWidget和QTabWidget之间无法区分

Nar*_*rek 15 c++ qt qt4 qsplitter qtabwidget

我在一个水平分离器中将QWidget和QTabWidget放在一起.分离器失去了它的形状,只有将鼠标悬停在它上面就可以知道有一个分离器.如何让它可见?

谢谢.

小智 27

由于QSplitterHandle(大多数人认为是'拆分器')是从QWidget派生的,因此您可以添加其他小部件.以下是我过去为解决这个问题所做的工作:

// Now add the line to the splitter handle
// Note: index 0 handle is always hidden, index 1 is between the two widgets
QSplitterHandle *handle = pSplitter->handle(1);
QVBoxLayout *layout = new QVBoxLayout(handle);
layout->setSpacing(0);
layout->setMargin(0);

QFrame *line = new QFrame(handle);
line->setFrameShape(QFrame::HLine);
line->setFrameShadow(QFrame::Sunken);
layout->addWidget(line);
Run Code Online (Sandbox Code Playgroud)

这为分离器手柄增加了一条凹陷线.当然,您可以为框架选择其他样式,line或者使用与添加到拆分器句柄的窗口小部件完全不同的样式.


小智 9

我基于上面的代码,但它处理两个分割器方向.我只是喜欢非不透明的大小调整和不可折叠的孩子.手柄由三条平行线组成.您可以使用手柄宽度进行游戏,但在Windows上抓握7看起来不错; 没有在Linux或Mac上签到.

void helper::decorateSplitter(QSplitter* splitter, int index)
{
    Q_ASSERT(splitter != NULL);

    const int gripLength = 15; 
    const int gripWidth = 1;
    const int grips = 3;

    splitter->setOpaqueResize(false);
    splitter->setChildrenCollapsible(false);

    splitter->setHandleWidth(7);
    QSplitterHandle* handle = splitter->handle(index);
    Qt::Orientation orientation = splitter->orientation();
    QHBoxLayout* layout = new QHBoxLayout(handle);
    layout->setSpacing(0);
    layout->setMargin(0);

    if (orientation == Qt::Horizontal)
    {
        for (int i=0;i<grips;++i)
        {
            QFrame* line = new QFrame(handle);
            line->setMinimumSize(gripWidth, gripLength);
            line->setMaximumSize(gripWidth, gripLength);
            line->setFrameShape(QFrame::StyledPanel);
            layout->addWidget(line);
        }
    }
    else
    {
        //this will center the vertical grip
        //add a horizontal spacer
        layout->addStretch();
        //create the vertical grip
        QVBoxLayout* vbox = new QVBoxLayout;
        for (int i=0;i<grips;++i)
        {
            QFrame* line = new QFrame(handle);
            line->setMinimumSize(gripLength, gripWidth);
            line->setMaximumSize(gripLength, gripWidth);
            line->setFrameShape(QFrame::StyledPanel);
            vbox->addWidget(line);
        }
        layout->addLayout(vbox);
        //add another horizontal spacer
        layout->addStretch();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

对于每个拆分器都是如此,至少使用WinXP和默认的Luna thema(改为经典解决问题).如果你想留在Luna,你可以改变分割器的渲染方式,例如通过改变手柄的背景颜色.

int main(int argc, char *argv[])    {

    QApplication a(argc, argv);
    a.setStyleSheet("QSplitter::handle { background-color: gray }");
    MainWindow w;
    w.show();
    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

您可以在https://doc.qt.io/qt-5/stylesheet-reference.html上找到有关Qt样式表的更多信息.