Frage

Ich habe gerade angefangen, an einem neuen C ++/QT -Projekt zu arbeiten. Es wird eine MDI-basierte IDE mit angedockten Widgets für Dinge wie den Dateibaum, Objektbrowser, Compiler-Ausgabe usw. QDockWidget kleiner. Zum Beispiel erstellt dieses Snippet mein unteres Dockfenster "Erstellen Sie Informationen":

m_compilerOutput = new QTextEdit;
m_compilerOutput->setReadOnly(true);
dock = new QDockWidget(tr("Build Information"), this);
dock->setWidget(m_compilerOutput);
addDockWidget(Qt::BottomDockWidgetArea, dock);

Beim Start sieht mein Programm so aus (denken Sie an die frühe Entwicklungsphase):

Actual

Ich möchte jedoch, dass es so erscheint:

Expected

Ich kann das nicht schaffen. Die QT -Referenz auf QdockWidget sagt Folgendes:

Hinweise der benutzerdefinierten Größe, minimale und maximale Größen und Größenrichtlinien sollten im Kinder -Widget implementiert werden. QdockWidget wird sie respektieren und ihre eigenen Einschränkungen an den Rahmen und den Titel einstellen. Größenbeschränkungen sollten nicht auf dem QdockWidget selbst festgelegt werden, da sie sich ändern, je nachdem, ob es angedockt ist

Dies deutet darauf hin, dass eine Methode, dies zu tun QTextEdit und überschreiben die sizeHint() Methode. Ich würde es jedoch vorziehen, dies nicht nur für diesen Zweck zu tun, und ich habe es auch nicht versucht, dies als Arbeitslösung zu finden.

Ich habe versucht anzurufen dock->resize(m_compilerOutput->width(), m_compilerOutput->minimumHeight()), rufen m_compilerOutput->setSizePolicy() Mit jeder seiner Optionen ... hat bisher nichts die Größe beeinträchtigt. Wie ich schon sagte, ich würde eine einfache Lösung in einigen Codezeilen bevorzugen, um eine Unterklasse zu erstellen, nur um sich zu ändern sizeHint(). Alle Vorschläge werden geschätzt.

War es hilfreich?

Lösung

Ich habe gerade denselben Prozess durchlaufen. Nach viel zu vielen Permutationen von resize(), adjustSize() und Freunde auf Dock -Widgets und ihr enthaltenes Widget, von denen keiner funktioniert hat, endete ich abklassigen QListView und das hinzufügen sizeHint() Methode.

Jetzt funktioniert es wie ein Zauber.

Andere Tipps

Ich habe es einfach gemacht: Header:

private void setDockSize(QDockWidget *dock, int, int);
  public slots:
  void returnToOldMaxMinSizes();

QUELLE:

QSize oldMaxSize, oldMinSize;

void MainWindow::setDockSize(QDockWidget* dock, int setWidth,int setHeight)
{

    oldMaxSize=dock->maximumSize();
    oldMinSize=dock->minimumSize();

  if (setWidth>=0)
    if (dock->width()<setWidth)
        dock->setMinimumWidth(setWidth);
    else dock->setMaximumWidth(setWidth);
  if (setHeight>=0)
    if (dock->height()<setHeight)
        dock->setMinimumHeight(setHeight);
    else dock->setMaximumHeight(setHeight);

    QTimer::singleShot(1, this, SLOT(returnToOldMaxMinSizes()));
}

void MainWindow::returnToOldMaxMinSizes()
{
    ui->dockWidget->setMinimumSize(oldMinSize);
    ui->dockWidget->setMaximumSize(oldMaxSize);
}

Es klingt so, als ob sich das Dock-Widget in Anbetracht des Child-Widgets auf die richtige Größe bewertet. Aus der QdockWidget -Dokumentation (Hervorhebung Mine):

Ein QdockWidget fungiert als Wrapper für sein Kinder -Widget, das mit setWidget () festgelegt ist. Hinweise der benutzerdefinierten Größe, minimale und maximale Größen und Größenrichtlinien sollten im Child Widget implementiert werden. QdockWidget wird sie respektieren und ihre eigenen Einschränkungen an den Rahmen und den Titel einstellen. Größenbeschränkungen sollten nicht auf dem QdockWidget selbst festgelegt werden, da sie sich je nach angedocktem Angedacht ändern. Ein Qdockwidget angedockt hat keinen Rahmen und eine kleinere Titelleiste.

Um die Größe zu ändern, müssen Sie das Kinder-Widget neu greatieren.

Bearbeiten: Die QT -Dokumentation kann manchmal irreführend sein, wenn sie Größe von Größe erörtert. Oft bezieht es sich auf jede Art der Größenänderung, unabhängig davon, ob sie automatisch vom Widget oder programmatisch durchgeführt werden.

Dies ist eine alte Frage, aber ich wollte mich einsetzen, um zu erwähnen, dass QT 5.6 die eingeführt hat Qmainwindow :: gegründete Schocks Funktionieren Sie dies.

Leider funktioniert es nicht für Mein Anwendungsfall (Bewegungsabscheider zwischen zwei Qdockwidgets, die mit QMainwindows geteilt wurden :: SplitdockWidget)

Haben Sie versucht anzurufen resize() auf der QTextEdit In Ihrem Dock -Widget? Sie können auch versuchen, die maximalen und minimalen Größen des Dock -Widgets vorübergehend auf die gewünschte Größe einzustellen und dann die ursprünglichen Werte wiederherzustellen.

Sie könnten das tun:

Stellen Sie eine maximale Höhe für Ihre QTextEdit:

m_compilerOutput = new QTextEdit;
m_compilerOutput->setMaximumHeight(100);

Und dann in der Show Event Von Ihrem Hauptfenster setzen Sie es wieder auf die alte Größe oder etwas Hoches:

void MainWindow::showEvent(QShowEvent *)
{
   m_compilerOutput->setMaximumHeight(10000);
}

Das ist alles, was Sie brauchen sollten.

Tests unter Verwendung der Größe der Größe auf dem QDockWidget::widget() (dh das Widget, dass das der QDockWidget ist verwaltet) nicht wie erwartet konsequent funktionieren.

Mit einer QDockWidget Unterklasse (DW), in der a QWidget mit einer QHBoxLayout Das hat zwei Widgets (Linkspan und rechter Panel) fügte hinzu, alle haben ihre Größenrichtlinien auf eingestellt QSizePolicy::Minimum, Das DW hat normalerweise beide Panel -Widgets sichtbar. Wenn die DW in einer Seitendockung einer Bewerbung positioniert ist (QMainWindow) Slot -Umgang mit den DWs dockLocationChanged Signal verbirgt den linken Panel und korrigiert das erneut DW->widget() auf die Größe rechts. Wenn der DW programmgesteuert in den unteren Dockbereich verschoben wird, ist der Linkspanel sichtbar und der DW füllt die volle Breite des Hauptfensters (natürlich). Wenn der DW dann programmgesteuert in einen Seitendockbereich verschoben wird, ist der linke Panel versteckt und die DW wird neu gegründet. Dies funktioniert wie beabsichtigt. Wenn der DW jedoch vom unteren Dockbereich in einen Seitendockbereich gezogen wird, obwohl der linke Panel versteckt ist und die nach wie vor angewendete Neugröße nicht wie zuvor angewendet wird, wird der DW nicht so hochgegriffen, als wenn die Neupositionierung programmatisch durchgeführt wird. Die DW kann manuell neu gestaltet werden, indem die Splitterhand zwischen dem DW- und dem Hauptfenster zentraler Bereich gezogen wird. Beachten Sie, dass der Hauptfenster zentraler Bereich a ist QWidget ein ... haben QHBoxLayout mit Größenpolitik QSizePolicy::Expanding.

Berufung adjustSize Im Hauptfenster hat nach der erneuten Größe des DW keine Wirkung. Dies trotz der DW, die neu implementiert wurde sizeHint Um seine Mindestgröße zurückzugeben, je nachdem, ob der linke Panel sichtbar ist oder nicht.

Entweder fehlt mir etwas, wie man die Größe von kontrollieren kann QDockWidget (Was angesichts der Schwierigkeit, alle Wechselwirkungen zwischen den Teilen des Layout -Management -Systems zu verstehen, ist sehr wahrscheinlich) oder die QMainWindow ignoriert oder überschreibt die Layout -Anweisungen, die es gegeben wird. Genau untersuchen des Ereignisstroms während der QDockWidget Die Neupositionierung von Operationen legt Letzteres nahe: Nach dem Slot -Umgang mit dem dockLocationChanged Signal hat seine Größenarbeit durchgeführt und in die Ereignisschleife zurückgekehrt. Ich kann sehen, dass die QMainWindow, wenn die Neupositionierung der Benutzer abgeschlossen ist, wendet zusätzliche Neugroße Operationen für die Betroffenen an QDockWidget So rückgängig die Anwendungslogik, die versucht, die Dockgröße zu steuern. Etwas scheint in der nicht mehr zu sein QMainWindow ....

Wenn die Dockwidgets angedockt sind, sind die Größen von ihren Eltern kontrolliert. In solchen Fällen können Sie die verwenden QMainWindow::resizeDocks Funktion.

Wenn es schwimmt, werden Größen von ihren Kindern bestimmt.Größenänderung Kinder um Ihren Zweck zu erreichen.

Das Problem der Größe des Dock-Widgets beim Maximieren der Mainwindow ist in QTBUG-16252 beschrieben (https://bugraports.qt.io/browse/qtbug-16252)

Ich habe eine andere Problemumgehung gefunden. Funktioniert für mich auf QT 5.4.1 Mingw auf Windows7. Es sieht so aus, als ob einige Operationen der Widget -Status -Wiederherstellung eng mit der Qapplication -Ereignisschleife zusammenhängen.

Dockwidget -Größen werden nur dann korrekt wiederhergestellt, wenn die folgenden Bedingungen erfüllt sind:

  1. restoreGeometry () wird vor der Eingabe von Qapplication :: exec () (zB im Konstruktor Ihrer Hauptwindow -Klasse) aufgerufen.

  2. restorestate () wird nach exec () (z. B. über QTimer) aufgerufen

Hier ist mein Code:

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

    //...

    MainWindow mainWindow;
    mainWindow.show();

    return application.exec();
}

MainWindow::MainWindow(...) 
{
    ui->setupUi(this);

    //...
    QTimer* nt = new QTimer(this);

    nt->setSingleShot(true);
    nt->setInterval( 100 );

    connect(nt, SIGNAL(timeout()), SLOT(restoreWidgetSettings()));
    nt->connect(nt, SIGNAL(timeout()), SLOT(deleteLater()));

    nt->start();

    restoreWidgetSettings(true);
}

void MainWindow::restoreWidgetSettings(bool geometryOnly) {

    //...
    QByteArray geometry = getSettings();

    restoreGeometry(geometry);

    if(geometryOnly)
        return;

    //... //create dock widgets here

    restoreState(mainWindowState);

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top