Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QMenuBar & QToolBar на своей форме QDialog


Автор: sergey_85 14.10.2009, 20:57
Привет!

В приложении создаю свою форму наследую от QDialog. На форме требуется создать главное меню, тулбар и конечно же другие контролы.
Делаю это, но вот беда - главное меню перекрывает тулбар, тулбар перекрывает меню и все это перекрывают остальные контролы на форме
(т.е. все они начинают отрисовываться от левого верхнего угла формы).  smile 

Странно, не пойму почему так, может что-то где-то пропустил?

Использую Qt 4.4.3 + MSVS2005

Код

FrmSchemaList::FrmSchemaList(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);

    menuBar = new QMenuBar(this);
    
    QMenu *menu = new QMenu("Menu");
    menu->addAction("File",this,SLOT(on_btnOk_clicked()));
    menu->addSeparator();
    menu->addAction("File2",this,SLOT(on_btnOk_clicked()));

    menuBar->addMenu(menu);

    toolBar = new QToolBar(this);
    toolBar->addAction("ToolFile",this,SLOT(on_btnOk_clicked()));
}

Автор: SABROG 14.10.2009, 22:48
Пробел в знаниях Layout классов?

Автор: sergey_85 15.10.2009, 07:21
может быть, это мой 1 проект в qt!

...хочется небольшой пример....

Автор: SABROG 15.10.2009, 07:31
Цитата(sergey_85 @ 15.10.2009,  07:21)
может быть, это мой 1 проект в qt!

...хочется небольшой пример....

Тогда будет справедливо, если ты выложишь исходники проекта целиком, посмотришь примеры в \examples\layouts и почитаешь документацию http://doc.qt.nokia.com/latest/layout.html

Автор: sergey_85 15.10.2009, 07:43
ок, посмотрю примеры, но только для меня непривычно, потому что при создании меню и тулбара они должны автоматом располагаться на форме и не перекрывать другие контролы.

Следуя из принципов лей-аутов мне следует для каждой менюшки кинуть на форму виджет, а в неё помещать меню, чтобы оно не перекрывалось?

Автор: SABROG 15.10.2009, 18:18
Выложи скриншот хотя бы, чтобы посмотреть, что там с чем перекрывается.

Автор: sergey_85 15.10.2009, 20:26
Итак есть пустое окно наследовал от QDialog, мне надо распложить там меню, несколько тулбаров, и дргие контролы (кнопки, списки и т.д.)

Что я делаю:
Код

FrmSchemaList::FrmSchemaList(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);

            layout = new QVBoxLayout();
    menuBar = new QMenuBar(this);
    
    QMenu *menu = new QMenu("Menu");
    menu->addAction("File",this,SLOT(on_btnOk_clicked()));
    menu->addSeparator();
    QAction *act = menu->addAction("File2",this,SLOT(on_btnOk_clicked()));
    act->setCheckable(true);
    act->setChecked(true);

    menuBar->addMenu(menu);

    toolBar = new QToolBar(this);

    //toolBar->setMovable(true);
    //toolBar->setFloatable(true);

    toolBar->addAction(tr("Новая"),this,SLOT(on_btnOk_clicked()));
    toolBar->addSeparator();
    toolBar->addAction(tr("Редактировать"),this,SLOT(on_btnOk_clicked()));
    toolBar->addSeparator();
    toolBar->addAction(tr("Удалить"),this,SLOT(on_btnOk_clicked()));

    layout->addWidget(this->toolBar);
    //layout->addWidget(this->ui.frame);
    
    //
    layout->setMargin(0);
    layout->setSpacing(0);
    layout->addStretch(0);
    //
    
    layout->setMenuBar(menuBar);
    this->setLayout(layout);
}


Результат меню перекрывает дочерние контролы формы (смотри скриншот в прикреплении)

Автор: SABROG 15.10.2009, 20:57
Цитата(sergey_85 @  15.10.2009,  20:26 Найти цитируемый пост)
Что я делаю:

Как таковых проблем именно с этим кодом я не вижу, за исключением того, что использовать русский текст в названиях/заголовках (вообще есть аналог слова title в русском, чтобы и с именем QObject'a не спутать и с header'ами?), вместо того, чтобы использовать tr().
user posted image

Снова возвращаемся к тому, чтобы ты выложил компилируемый проект целиком...

Автор: sergey_85 15.10.2009, 21:07
а окно на скрине от QDialog, потому с формой QMainWindow у меня нет проблем, там менюшки создаются нормально!

Автор: SABROG 15.10.2009, 21:15
Цитата(sergey_85 @ 15.10.2009,  21:07)
а окно на скрине от QDialog, потому с формой QMainWindow у меня нет проблем, там менюшки создаются нормально!

Я тоже от QDialog отнаследовался. Проблемы должны начаться при добавлении кнопочек и табвиджетов, которые ты не добавил в layout судя по коду. Ну - нет, так - нет...

Автор: sergey_85 15.10.2009, 21:16
ага точно создал такой же проект только с нуля и там все как и у тебя на скрине, буду дальше долбить.

ха что за ... уже 2 дней мучаюсь!

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

а не не все попробуй кинь кнопку в позицию на форме 0,0 как?

Добавлено через 6 минут и 2 секунды
так значит буду разбираться с лей-аутами

Добавлено через 11 минут и 48 секунд
Хорошо, но вот еще вопросик остался как сделать так как на скриншоте?

Автор: SABROG 15.10.2009, 21:32
Цитата(sergey_85 @  15.10.2009,  21:16 Найти цитируемый пост)
Хорошо, но вот еще вопросик остался как сделать так как на скриншоте?


В QVBoxLayout добавляется последним QGridLayout, а уже в него добавляются остальные компоненты. Это проще сделать в дизайнере и потом просто подсмотреть код.

Автор: sergey_85 15.10.2009, 21:38
ok

Автор: SABROG 15.10.2009, 21:45
Цитата(sergey_85 @ 15.10.2009,  21:38)
ok

Суровые челябинские программисты работают даже в 00:44?

Автор: sergey_85 15.10.2009, 21:48
приходиться, а ты  сам откуда?

просто эта вата одалела надо её добить уже 2 дня мозг напрягаю из-за меню с парой кнопок
в  студии под c# или builder секунд за 20 сделал бы, а ту т по ночам  smile 
пару кнопок кинул и все! работай дальше, надеюсь троли упростят мне работу в будущем

Добавлено через 2 минуты и 58 секунд
так то мы здесь все суровые...

Автор: SABROG 15.10.2009, 22:51
Цитата(sergey_85 @ 15.10.2009,  21:48)
так то мы здесь все суровые...

Да в Москве не менее суровее, фильм "Москва слезам не верит" вышел почти 30 лет назад, а за это время ничего не изменилось. Коренные москвичи живут как бомжи, а воров в законе хоронят на ваганьковском кладбище рядом с заслуженными артистами советского союза под охраной омона. Президент России пишет блоги и статьи с обращением к народу, в комментариях - мат, который подвергается цензуре (свобода слова? ага щазз), а если не мат, то никто просто не верит. По сути мы рабы, которые думают, что свободны. Нам дают корки хлеба, чтобы мы не сдохли окончательно, если мы еще в состоянии принести кому-то доход. Отчасти я поэтому не иду работать программистом. Пишу для себя, для души, когда она этого потребует. Иногда задумываюсь зачем мне все это надо, когда всё так стремительно развивается, что те знания, которые я сейчас получаю через 5 лет не будут стоить и ломаного гроша. А с появлением семьи вообще придется забыть о вечерних посиделках на форумах. В общем у всех свои проблемы.

Автор: sergey_85 16.10.2009, 08:55
да жизнь еще та штука, а итог один - у кого бабло тот и живет, а нет бабла, то только существовать!

//-----------------------------------------
+ кризис зп по минимуму платят.

у меня знакомая пришла бухгалтером устраиваться 10 тыс., она говорит что за  ... зп такая, а ей в ответ а что вы хотели, вам этого мало? и так почти везде!

Ну все я с layout'ами  разобрался, здесь тестовый код, но может кому понадобиться, есть у тролтехов хороший пример: layouts->dynamic layouts.
Код

    layout = new QGridLayout();
    menuBar = new QMenuBar(this);
    
    QMenu *menu = new QMenu("Menu");
    menu->addAction("File",this,SLOT(on_btnOk_clicked()));
    menu->addSeparator();
    QAction *act = menu->addAction("File2",this,SLOT(on_btnOk_clicked()));
    act->setCheckable(true);
    act->setChecked(true);

    menuBar->addMenu(menu);

    toolBar = new QToolBar(this);

    toolBar->addAction(tr("Новая"),this,SLOT(on_btnOk_clicked()));
    toolBar->addSeparator();
    toolBar->addAction(tr("Редактировать"),this,SLOT(on_btnOk_clicked()));
    toolBar->addSeparator();
    toolBar->addAction(tr("Удалить"),this,SLOT(on_btnOk_clicked()));

     QHBoxLayout *lH = new QHBoxLayout;
     lH->addWidget(this->ui.listView);
     this->ui.groupBox->setLayout(lH);

     QGridLayout *gl = new QGridLayout;
     gl->addWidget(this->ui.btnHelp, 0, 0);
     gl->addWidget(this->ui.btnCancel, 0, 2);
     gl->addWidget(this->ui.btnOk, 0, 3);
     gl->setColumnStretch(1, 1);
     this->ui.widget->setLayout(gl);

    layout->addWidget(this->toolBar,0,0);
    layout->addWidget(this->ui.groupBox,1,0);
    layout->addWidget(this->ui.widget,2,0);

    
    //
    //layout->setMargin(1);
    //layout->setSpacing(1);
    //layout->addStretch(0);
    //
    
    layout->setMenuBar(menuBar);
    this->setLayout(this->layout);



Цитата

А с появлением семьи вообще придется забыть о вечерних посиделках на форумах.

да это точно сказано!

Спасибо за помощь, SABROG!

Автор: pan2004 16.10.2009, 12:54
Странно, почему наследовался от QDialog, когда QMainWindow больше подходит для размещения меню и тулбаров.
Например в твоей программе, даже с лэйаутами тебе не удасться просто так перетащить тулбар мышкой, хотя QMainWindow эту функциональность представляет.

Автор: sergey_85 16.10.2009, 20:29
почему от QDialog, а не от QMainWindow, т.к. по сути QMainWindow представляет главное окно приложения, а оно должно быть одно, наверно потому и не от него!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)