2015-02-12 2 views
0

Я пытаюсь построить бескаркасное окно с одним текстовым ярлыком с изменяющимся текстом в зависимости от выбранного языка и границы вокруг него. Это окно всегда должно иметь минимально возможный размер. Вот простой код без каких-либо конфигураций, которые я пробовал до сих пор.Force QMainWindow для точного размера отображаемого текста

QMainWindow* clientIDDisplay = new QMainWindow(0, Qt::Window 
               | Qt::FramelessWindowHint 
               | Qt::WindowStaysOnTopHint); 

QGroupBox* mainWidget = new QGroupBox(clientIDDisplay); 
mainWidget->setStyleSheet(stylesheetGroupBox); 

QLabel* labelClientID = new QLabel(clientIDDisplay);  
labelClientID->setStyleSheet(stylesheetLabel); 
labelClientID->setText("Client"); 

QHBoxLayout* mainLayout = new QHBoxLayout(clientIDDisplay); 
mainLayout->addWidget(labelClientID); 
mainWidget->setLayout(mainLayout); 

clientIDDisplay->setCentralWidget(mainWidget); 

clientIDDisplay->show(); 

Это показывает окно, но оно не так мал, как должно быть, осталось много места.

Использование setMinimumSize(0,0) не помогает. Я думаю, что я понимаю, использовать QSizePolicy для изменения размеров виджетов в зависимости от друг друга в одном макете, как объясняется в этом сообщении layout mechanism. Но это единый виджет в групповом ящике, не знаю, виджет виджет вызывает больший размер этого окна. Используя setFixedSize(), я могу получить меньший размер, но я не знаю способ установить нужный размер. width() ярлыка НЕ ​​является шириной отображаемого текста.

Может кто-нибудь объяснить, какие конфигурации я должен установить, чтобы получить мое минималистичное окно? Я уверен, что кое-что упускаю, но я застрял.

ответ

0

Во-первых,You need to adjust the size of each widget to fit to its content.

labelClientID->adjustSize(); 
mainWidget->adjustSize(); 
clientIDDisplay->adjustSize(); 

Это должно быть сделано снизу вверх работать, как ожидалось. Сначала виджет самого низкого уровня, затем его родительский элемент и т. Д. До виджета верхнего уровня. Он должен работать с политиками размера и размерами по умолчанию.

В вашем случае сделайте это до clientIDDisplay->show();, чтобы предотвратить мерцание на экране.

В своем коде вы создаете макет и виджет с неправильных родителей. исправить это.

Во-вторых, вам не нужен QMainwindow как лучший родитель, QWidget дают лучший результат.

Попробуйте сами:

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

    QWidget* top_widget = new QWidget(0, Qt::Widget | Qt::FramelessWindowHint 
             | Qt::WindowStaysOnTopHint); 

    QGroupBox* mainWidget = new QGroupBox(top_widget); 

    QLabel* labelClientID = new QLabel(); 
    labelClientID->setText("Client"); 

    QHBoxLayout* mainLayout = new QHBoxLayout(mainWidget); 
    mainLayout->addWidget(labelClientID); 
    mainWidget->setLayout(mainLayout); 


    labelClientID->adjustSize(); 
    mainWidget->adjustSize(); 
    top_widget->adjustSize(); 

    top_widget->show(); 


    return a.exec(); 
} 

Widget:
enter image description here
Window (только изменяя тип top_widget и использование Qt::Window):
enter image description here

+0

Спасибо, отлично работает для меня! Вы также прав насчет воспитания. Но это приводит к другому вопросу. Вы не установили родителя в 'QLabel()'. Я считаю, это связано с тем, что Qt автоматически устанавливает родительский элемент с 'addWidget()'. Не работает 'setLayout()' то же самое? Я читал об этом в следующем потоке [ссылка] (http://qt-project.org/forums/viewthread/9050) – Rappit

+0

да, он делает. Поэтому не стоит беспокоиться о том, имел ли «labelClientID» родительский набор. Это отличается от макетов. 'mainLayout = новый QHBoxLayout (clientIDDisplay);' означает mainLayout - это макет на 'clientIDDisplay'. Таким образом, 'mainWidget-> setLayout (mainLayout);' будет терпеть неудачу, с сообщением о стандартном выходе и вещах, которые не выглядят правильно. Когда я знаю, что виджет будет добавлен в макет или будет установлен макет, я не создам их с родителем. Это всего лишь один выбор среди многих. Но я стараюсь оставаться последовательным. – UmNyobe

Смежные вопросы