меню отдельным классом

вопросы по созданию программ с использованием возможностей библиотеки PHPQt5

Moderator: ArtMares

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
Может я опять не в том порядке вызываю компоненты...  но хотел сделать класс который будет отвечать за меню  и что то не показывается это меню . 

форма отображается а меню нет ( 
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);


    }
}
Унабле то лоад дынамиц либрары

ArtMares
User avatar
 
Posts: 72
Location: Москва
Конечно у тебя не отображается меню так как оно у тебя принадлежит другому окну из-за того что класс 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);
}
PQStudio Development Progress: 75%
Version: 0.2

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
да я хотел отделисть меню от основного класса интерфейса  чтобы потом легче было править. 


кажись понял 
мне $this->setMenuBar($this->menuBar);  это нужно делать в том классе с которого вызываю создание меню  а сам класс меню ниоткого наследовать не нужно? 
Унабле то лоад дынамиц либрары

ArtMares
User avatar
 
Posts: 72
Location: Москва
[bquote=zazaka|/viewtopic.php?f=7&t=16&p=79#p79|23 мар 2016, 14:48]да я хотел отделисть меню от основного класса интерфейса  чтобы потом легче было править.


кажись понял
мне $this->setMenuBar($this->menuBar);  это нужно делать в том классе с которого вызываю создание меню  а сам класс меню ниоткого наследовать не нужно?[/bquote]
Да правильно сам класс не нужно ни откого наследовать.
Сам класс должен только вернуть объект QMenuBar, который ты уже привяжешь к нужному окну
PQStudio Development Progress: 75%
Version: 0.2

WxMaper
User avatar
Администратор
 
Posts: 92
[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;
    }
}

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
[size=normal]WxMaper[/size]

О! это ваще супер!) спс  щас попробую
Унабле то лоад дынамиц либрары

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
чтото получилось сделать только так вызывая меню 
Code:
$this->menuBar = new MyMenuBar($this);
и в самом классе меню 
Code:
public function __construct($forma)
    {
        parent::__construct();

        $this->menuBar = new QMenuBar($forma);
 иначе меню не появлялось 

а также оно выглядит немного странным
Image

Размер формы я не задавал!
Last edited by zazaka on 23 Mar 2016, 19:39, edited 1 time in total.
Унабле то лоад дынамиц либрары

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
кстати получилось сделать вложеное меню в текущей версии без обновления)) 


Image


Кстати поменял размер формы !  а меню как было урезанным так и осталось !(((
Code:
$this->resize(500, 200);
Унабле то лоад дынамиц либрары

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
каких только глюков я непонаделал ... 
всеголишь добавил строку 
Code:
set_tr_lang('ru');
зато каков эффект!!___ ))) 


Image

можно меня назначать отвественным глюкогенератором)))
Унабле то лоад дынамиц либрары

rinart73
User avatar
 
Posts: 36
Skype: art7emw
Эта стрелка... >>... У тебя неправильно добавлен менюбар.
Думаю, изначальный код просто не обновляли некоторое время, вот ты на его основе и сделал приложение, которое работает не так, как ожидалось.
Вот скорректированный пример стартового приложения.

Так неправильно, потому что ты создаешь 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;
Почетный страдалец фигней
Пилю load_ui_file :good2:

WxMaper
User avatar
Администратор
 
Posts: 92
[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

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
блин... 
я уже вроде всё перепробовал что вы писали 

в классе формы пишу 
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  пункт меню сделать
Last edited by zazaka on 24 Mar 2016, 08:12, edited 1 time in total.
Унабле то лоад дынамиц либрары

WxMaper
User avatar
Администратор
 
Posts: 92
Вот переделанный пример стартового проекта 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();

zazaka
User avatar
Ответственный глюкогенератор
 
Posts: 98
Супер_)  то что надо ! благодарю)
Унабле то лоад дынамиц либрары


Вернуться в Вопрошайка

Who is online
Users browsing this forum: No registered users and 6 guests