Page 1 of 1
меню отдельным классом
PostPosted: 23 Mar 2016, 12:55
by zazaka
Может я опять не в том порядке вызываю компоненты... но хотел сделать класс который будет отвечать за меню и что то не показывается это меню .
форма отображается а меню нет (
- Code:
class createMenus extends QMainWindow {
private $menuBar;
public function __construct($forma)
{
parent::__construct();
$this->menuBar = new QMenuBar($forma);
pre ($forma);
/* File menu */
$fileMenu = $this->menuBar->addMenu( tr("File") );
$aboutAction = $fileMenu->addAction( 'icons/about.png', tr("About") );
$aboutAction->connect(SIGNAL('triggered(bool)'), $this, SLOT('onMenuAboutAction(bool)'));
$fileMenu->addSeparator();
$this->setMenuBar($this->menuBar);
return( $this->menuBar);
}
public function onMenuAboutAction($sender, $checked) {
QMessageBox::about($this, tr("About"), tr("This is 'About' menu action.\r\nChange code in `onMenuOpenAction` function."));
QMessageBox::aboutQt($this);
}
public function onMenuQuitAction($sender, $checked) {
qApp::quit();
}
}
class MainWindow extends QMainWindow
{
private $storage;
private $debyg;
private $centralWidget;
private $menu;
protected $array_object = array(); /// массив с элементами
protected $forma;
/**
* MainWindow constructor.
* @param $forma
*/
public function __construct()//$forma
{
parent::__construct();
$this->initComponents();
}
private function initComponents()
{
$this->centralWidget = new QWidget;
$this->menu = new createMenus($this);
}
}
Re: меню отдельным классом
PostPosted: 23 Mar 2016, 13:14
by ArtMares
Конечно у тебя не отображается меню так как оно у тебя принадлежит другому окну из-за того что класс createMenus наследуюется от QMainWindow
Вот этой строкой
- Code:
$this->setMenuBar($this->menuBar);
ты привязываешь меню к окну класса createMenus
Если честно не совсем понимаю зачем создавать отдельный класс для того чтобы сделать меню. когда можно просто объявить метод в классе MainWindow и вызвать его в конструкторе
- Code:
private function initMenu() {
$menuBar = new QMenuBar($this);
$fileMenu = $menuBar->addMenu(tr("File"));
$quitAction = $fileMenu->addAction(tr("Quit"));
$viewMenu = $menuBar->addMenu(tr('View'));
$panelComponents = $viewMenu->addAction(tr('Components Panel'));
$panelComponents->checkable = true;
$this->setMenuBar($menuBar);
}
Re: меню отдельным классом
PostPosted: 23 Mar 2016, 14:48
by zazaka
да я хотел отделисть меню от основного класса интерфейса чтобы потом легче было править.
кажись понял
мне $this->setMenuBar($this->menuBar); это нужно делать в том классе с которого вызываю создание меню а сам класс меню ниоткого наследовать не нужно?
Re: меню отдельным классом
PostPosted: 23 Mar 2016, 14:54
by ArtMares
[bquote=zazaka|/viewtopic.php?f=7&t=16&p=79#p79|23 мар 2016, 14:48]да я хотел отделисть меню от основного класса интерфейса чтобы потом легче было править.
кажись понял
мне $this->setMenuBar($this->menuBar); это нужно делать в том классе с которого вызываю создание меню а сам класс меню ниоткого наследовать не нужно?[/bquote]
Да правильно сам класс не нужно ни откого наследовать.
Сам класс должен только вернуть объект QMenuBar, который ты уже привяжешь к нужному окну
Re: меню отдельным классом
PostPosted: 23 Mar 2016, 15:13
by WxMaper
[bquote=zazaka|/viewtopic.php?f=7&t=16&p=79#p79|23 мар 2016, 14:48] а сам класс меню ниоткого наследовать не нужно? [/bquote]
Твой класс можно унаследовать от самого меню, тогда и возвращать ничего не придется, просто создашь объект:
- Code:
class MyMenuBar extends QMenuBar {
public function __construct() {
parent::__construct();
}
}
class MainWindow extends QMainWindow {
public function __construct() {
parent::__construct();
/* ... */
$this->menuBar = new MyMenuBar;
}
}
Re: меню отдельным классом
PostPosted: 23 Mar 2016, 15:39
by zazaka
[size=normal]WxMaper[/size]
О! это ваще супер!) спс щас попробую
Re: меню отдельным классом
PostPosted: 23 Mar 2016, 19:11
by zazaka
чтото получилось сделать только так вызывая меню
- Code:
$this->menuBar = new MyMenuBar($this);
и в самом классе меню
- Code:
public function __construct($forma)
{
parent::__construct();
$this->menuBar = new QMenuBar($forma);
иначе меню не появлялось
а также оно выглядит немного странным
Размер формы я не задавал!
Re: меню отдельным классом
PostPosted: 23 Mar 2016, 19:34
by zazaka
кстати получилось сделать вложеное меню в текущей версии без обновления))
Кстати поменял размер формы ! а меню как было урезанным так и осталось !(((
- Code:
$this->resize(500, 200);
Re: меню отдельным классом
PostPosted: 23 Mar 2016, 20:25
by zazaka
каких только глюков я непонаделал ...
всеголишь добавил строку
- Code:
set_tr_lang('ru');
зато каков эффект!!___ )))
можно меня назначать отвественным глюкогенератором)))
Re: меню отдельным классом
PostPosted: 23 Mar 2016, 22:17
by rinart73
Эта стрелка... >>... У тебя неправильно добавлен менюбар.
Думаю, изначальный код просто не обновляли некоторое время, вот ты на его основе и сделал приложение, которое работает не так, как ожидалось.
Вот
скорректированный пример стартового приложения.
Так
неправильно, потому что ты создаешь QMenuBar, родителем которого является окно. И менюбар добавляется не как менюбар, а как стандартный виджет:
- Code:
private $menuBar;
private function initMenus() {
$this->menuBar = new QMenuBar($this);
Правильно - 1 вариант (присоединяем QMenuBar к окну в качестве менюбара):
- Code:
private $menuBar;
private function initMenus() {
$this->menuBar = new QMenuBar;
$this->setMenuBar($this->menuBar);
Правильно - 2 вариант (дело в том, что у QMainWindow есть св-во menuBar и переопределять его совсем не обязательно):
- Code:
//private $menuBar;
private function initMenus() {
$this->menuBar = new QMenuBar;
Re: меню отдельным классом
PostPosted: 24 Mar 2016, 01:34
by WxMaper
[bquote=rinart73|/viewtopic.php?f=7&t=16&p=97#p97|23 мар 2016, 22:17]дело в том, что у QMainWindow есть св-во menuBar и переопределять его совсем не обязательно[/bquote]
Кстати, появилось это свойство относительно недавно :)
[bquote=zazaka|/viewtopic.php?f=7&t=16&p=89#p89|23 мар 2016, 19:11]оно выглядит немного странным[/bquote]
Потому что ты нарушил структуру программы. Создавая меню, указываешь родителем один виджет и тут же это меню устанавливаешь другому виджету, вот оно у тебя и не отображается как надо.
На счет вопросиков - проверь кодировку файла переводом. Она должна быть такая же как и у файлов PHP - UTF-8
Re: меню отдельным классом
PostPosted: 24 Mar 2016, 07:27
by zazaka
блин...
я уже вроде всё перепробовал что вы писали
в классе формы пишу
- Code:
private function initComponents()
{
$this->centralWidget = new QWidget;
$this->menuBar = new MyMenuBar;
}
В классе меню пишу
- Code:
class MyMenuBar extends QMenuBar
{
private $menuBar;
public function __construct()
{
parent::__construct();
$this->menuBar = new QMenuBar;
$fileMenu = $this->menuBar->addMenu( tr("program") );
}
И не отображается меню на форме
я так понимаю что косяк из за того что я пишу в классе меню $this->menuBar = new QMenuBar;
а как это переделать без этой строки а то ошибку выдаёт
как мне в этом классе MyMenuBar пункт меню сделать
Re: меню отдельным классом
PostPosted: 24 Mar 2016, 08:09
by WxMaper
Вот переделанный пример стартового проекта QMainWindow:
- Code:
class MyMenuBar extends QMenuBar {
public $aboutAction;
public $quitAction;
public $otherAction;
public function __construct($parent) {
parent::__construct($parent);
$fileMenu = $this->addMenu("File");
$this->aboutAction = $fileMenu->addAction("About");
$fileMenu->addSeparator();
$this->quitAction = $fileMenu->addAction("Quit");
$editMenu = $this->addMenu("Edit");
$this->otherAction = $editMenu->addAction('Action without icon');
}
}
class MainWindow extends QMainWindow {
private $menuBar;
private $centralWidget;
public function __construct() {
parent::__construct();
$this->initComponents();
$this->initMenus();
}
private function initComponents() {
$this->centralWidget = new QWidget;
}
private function initMenus() {
$this->menuBar = new MyMenuBar($this);
$this->menuBar->aboutAction->connect(SIGNAL('triggered(bool)'),
$this, SLOT('onMenuAboutAction(bool)'));
$this->menuBar->quitAction->connect(SIGNAL('triggered(bool)'),
$this, SLOT('onMenuQuitAction(bool)'));
$this->menuBar->otherAction->onTriggered = function() {
pre('Hello');
};
}
public function onMenuAboutAction($sender, $checked) {
QMessageBox::about($this, tr("About"), tr("This is 'About' menu action.\r\nChange code in `onMenuOpenAction` function."));
QMessageBox::aboutQt($this);
}
public function onMenuQuitAction($sender, $checked) {
qApp::quit();
}
}
$mainWindow = new MainWindow;
$mainWindow->show();
qApp::exec();
Re: меню отдельным классом
PostPosted: 24 Mar 2016, 08:38
by zazaka
Супер_) то что надо ! благодарю)