Frage

Ich bin Puting ein QWidget und QTabWidget nebeneinander in einem horisontal Splitter. Und die Splitter es die Form verliert, können Sie wissen, dass es ein Splitter ist nur mit der Maus schwebt auf ihm. Wie man es sichtbar machen?

Danke.

War es hilfreich?

Lösung

Da die QSplitterHandle (das ist, was die meisten Leute denken, der als ‚Splitter‘) von QWidget abgeleitet ist, können Sie andere Widgets hinzufügen. Hier ist, was ich habe genau dieses Problem in der Vergangenheit zu lösen getan:

// 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);

Das fügt eine versunkene Linie an den Splitter Griff. Sie können, natürlich, wählen Sie einen anderen Stil für den Rahmen line oder Verwendung etwas ganz anderes als das Widget, das Sie an den Splitter Griff hinzuzufügen.

Andere Tipps

I basiert dies auf dem obigen Code, aber es behandelt die beiden Splitter Orientierungen. Ich habe gerade nicht opake Redimensionierung bevorzuge und nicht zusammenklappbar Kinder. Der Griff besteht aus drei parallelen Linien. Sie können mit der Griffweite, aber Griff 7 sieht gut aus auf Windows spielen; nicht unter Linux oder Mac überprüft.

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();
    }
}

Das gilt für jeden Splitter zumindest mit WinXP und der Standard-Luna thema (Wechsel zum klassischen löst das Problem). Wenn Sie mit Luna bleiben wollen, können Sie die Art und Weise ändern sich die Splitter gemacht werden, zum Beispiel durch die Hintergrundfarbe des Griffs verändert wird.

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

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

Sie können mehr auf Qt-Stylesheets finden Sie unter https: // doc. qt.io/qt-5/stylesheet-reference.html

Sie können QSplitter Unterklasse und es ist protected virtual QSplitterHandle * QSplitter::createHandle() zu Rückkehr alles außer Kraft setzen, die Sie glücklich macht.

Zum Beispiel von dieser überladenen Methode Sie Unterklasse von QSplitterHandle mit benutzerdefinierter Zeichnung zurückkehren können.

Dank Merula Antwort ... Ich habe versucht, diese und jetzt meine Splitter sind sichtbar und sehen sehr schön aus, ohne aufdringlich zu suchen. Dieser Code ist für Python mit PyQt oder pyside.

app = QtGui.QApplication(sys.argv)
app.setStyle("Plastique")   # set style (using this style shows splitters! :)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top