QSplitter становится неразличимым между QWidget и QTabWidget - PullRequest
15 голосов
/ 30 марта 2010

Я помещаю QWidget и QTabWidget рядом друг с другом в один горизонтальный сплиттер. И сплиттер теряет свою форму, вы можете узнать, что сплиттер есть только при наведении на него мыши. Как сделать это видимым?

Спасибо.

Ответы [ 5 ]

27 голосов
/ 02 апреля 2010

Поскольку 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);

Это добавляет затонувшую линию к ручке сплиттера. Конечно, вы можете выбрать другой стиль для фрейма line или использовать что-то совершенно другое в качестве виджета, который вы добавляете в маркер сплиттера.

9 голосов
/ 22 ноября 2012

Я основал это на приведенном выше коде, но он обрабатывает обе ориентации сплиттера. Я просто предпочел непрозрачные изменяющие размеры и неразборные дети. Ручка состоит из трех параллельных линий. Вы можете играть с шириной ручки, но ручка на 7 выглядит хорошо в Windows; не проверял в 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();
    }
}
7 голосов
/ 30 марта 2010

Это верно для каждого сплиттера, по крайней мере, с WinXP и стандартной темой Luna (переход к классическому разрешает проблему). Если вы хотите остаться с 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();
}

Вы можете найти больше на таблицах стилей Qt в https://doc.qt.io/qt-5/stylesheet-reference.html

0 голосов
/ 24 июня 2014

Благодаря ответу Мерулы ... Я попробовал это, и теперь мои сплиттеры видны и выглядят очень хорошо, не выглядя навязчиво. Этот код предназначен для Python, использующего PyQt или PySide.

app = QtGui.QApplication(sys.argv)
app.setStyle("Plastique")   # set style (using this style shows splitters! :)
0 голосов
/ 30 марта 2014

Вы можете создать подкласс QSplitter и переопределить его protected virtual QSplitterHandle * QSplitter::createHandle(), чтобы вернуть все, что вас радует.

Например, из этого перегруженного метода вы можете вернуть подкласс QSplitterHandle с пользовательским рисунком.

...