C++ изменяет размер прикрепленного QT QDockWidget программно?

Это называется назначением кортежей. например, если вы хотите инициировать две переменные x и y и назначить для них два значения a и b, вы можете сделать это следующим образом:

x = a
y = b

или просто:

x, y = a, b

в этом случае первое значение «a» будет назначено первой переменной «x», а второе значение «b» будет назначено второй переменной «y». В этом очень полезно поменять два значения без использования временной переменной следующим образом: x, y = y, x

в вашем случае вы инициируете две переменные: носки и пары, поэтому за ними должны следовать два значения , В вашем случае:

socks = Counter(map(int, input().strip().split()))
pairs = 0

Итак, совершенно очевидно, что вы не можете присвоить одно значение двум переменным. так что вы не можете удалить 0 (начальное значение пар), которое является зарезервированной переменной для накопления во время цикла.

26
задан Kos 3 January 2013 в 16:31
поделиться

6 ответов

Я только что прошел этот же процесс. Попробовав слишком много перестановок resize(), adjustSize() и друзей в док-виджетах и ​​содержащихся в них виджетах, ни один из которых не сработал, я получил подклассы QListView и добавил метод sizeHint().

Теперь это работает как шарм.

4
ответ дан Charl Botha 28 November 2019 в 07:52
поделиться

Звучит так, будто виджет-док изменяет свой размер до нужного размера, учитывая его дочерний виджет. Из документации QDockWidget (выделено мной):

QDockWidget действует как обертка для своего дочернего виджета, установленного с помощью setWidget (). Настраиваемые подсказки размеров, минимальные и максимальные размеры и политики размера должны быть реализованы в дочернем виджете . QDockWidget будет уважать их, корректируя свои собственные ограничения, чтобы включить фрейм и заголовок. Ограничения размера не должны быть установлены на самом QDockWidget, потому что они изменяются в зависимости от того, присоединен ли он к док-станции; закрепленный QDockWidget не имеет рамки и меньшей строки заголовка.

Чтобы изменить размер, необходимо изменить размер дочернего виджета.

РЕДАКТИРОВАТЬ: документация Qt иногда может вводить в заблуждение, когда обсуждаются подсказки размера. Часто это относится к любому виду изменения размера, выполняется ли оно автоматически виджетом или программно.

6
ответ дан TreDubZedd 28 November 2019 в 07:52
поделиться

Тесты с использованием изменения размера на QDockWidget::widget() (т.е. виджет, которым управляет QDockWidget) не всегда работают должным образом.

С подклассом QDockWidget (DW), в который добавлен QWidget с QHBoxLayout, который имеет два виджета ( левая панель и правая панель ), каждый из которых имеет свои политика размера установлена ​​на QSizePolicy::Minimum, в DW обычно видны оба виджета панели. Когда DW расположен в боковой док-станции, слот приложения (QMainWindow), обрабатывающий сигнал DW dockLocationChanged, скрывает левую панель и изменяет размеры DW->widget() до размера правой панели. Когда DW программно перемещается в нижнюю область дока, leftPanel устанавливается видимым, и DW заполняет всю ширину главного окна (конечно). Когда DW затем программно перемещается в боковую область дока, левая панель скрывается, а DW изменяет размеры вниз. Это работает как задумано. Однако, если DW перетаскивается из нижней области дока в боковую область дока, хотя левая панель скрыта, а изменение размера применено, как и раньше, размер DW не уменьшается, как при перепрограммировании. Размер DW можно вручную уменьшить, перетаскивая ручку сплиттера между DW и центральной областью главного окна. Обратите внимание, что центральная область главного окна - это QWidget, имеющая QHBoxLayout с размерами политик QSizePolicy::Expanding.

Вызов adjustSize в главном окне после изменения размера DW не имеет никакого эффекта. Это несмотря на то, что DW повторно реализовал sizeHint, чтобы вернуть его минимальный размер в зависимости от того, видна ли левая панель или нет.

Либо я что-то упускаю в том, как контролировать размер QDockWidget (что, учитывая трудности, с которыми я столкнулся, понимая все взаимодействия между частями системы управления компоновкой, вполне вероятно), либо QMainWindow игнорирует или отменяет инструкции макета, которые ему даются. Тщательное изучение потока событий во время операций репозиции QDockWidget позволяет предположить следующее: после обработки слота сигнал dockLocationChanged выполнил свою работу по изменению размера и вернулся в цикл обработки событий. Я вижу, что QMainWindow, когда репозиционирование пользователя выполнено , применяет дополнительные операции изменения размера к уязвимому QDockWidget, тем самым отменяя логику приложения, которая пытается контролировать размер дока. Что-то не так в QMainWindow ....

1
ответ дан Chandra Sekhar 28 November 2019 в 07:52
поделиться

Если док-виджеты закреплены, размеры контролируются их родителем. В таких случаях вы можете использовать функцию QMainWindow::resizeDocks.

Если плавающий, размеры определяются их детьми. Измените размер детей , чтобы достичь вашей цели.

1
ответ дан Martin Evans 28 November 2019 в 07:52
поделиться

Проблема изменения размера док-виджетов при максимизации MainWindow описана в QTBUG-16252 ( https://bugreports.qt.io/browse/QTBUG-16252 )

I ' Мы нашли другой обходной путь. У меня работает на QT 5.4.1 minGW на Windows7. Похоже, что некоторые операции восстановления состояния виджета тесно связаны с циклом событий QApplication.

Размеры DockWidget восстанавливаются корректно ТОЛЬКО при соблюдении следующих условий:

  1. restoreGeometry () вызывается ДО ввода QApplication :: exec () (например, в конструкторе вашего класса MainWindow)

  2. restoreState () называется ПОСЛЕ exec () (например, через QTimer)

Вот мой код:

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

}
0
ответ дан vrogach 28 November 2019 в 07:52
поделиться

Пробовали ли вы вызвать resize() на QTextEdit внутри вашего док-виджета? Вы также можете попробовать временно установить максимальный и минимальный размеры виджета док-станции на нужный вам размер, а затем восстановить исходные значения.

2
ответ дан 28 November 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: