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

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

Модератор: ArtMares

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

форма отображается а меню нет ( 

phpqt Код:

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
Аватара пользователя
 
Сообщения: 72
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 5 раз
Конечно у тебя не отображается меню так как оно у тебя принадлежит другому окну из-за того что класс createMenus наследуюется от QMainWindow
Вот этой строкой
phpqt Код:
$this->setMenuBar($this->menuBar);

ты привязываешь меню к окну класса createMenus

Если честно не совсем понимаю зачем создавать отдельный класс для того чтобы сделать меню. когда можно просто объявить метод в классе MainWindow и вызвать его в конструкторе
phpqt Код:
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
Аватара пользователя
Ответственный глюкогенератор
 
Сообщения: 98
Поблагодарили: 2 раза
да я хотел отделисть меню от основного класса интерфейса  чтобы потом легче было править. 


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

ArtMares
Аватара пользователя
 
Сообщения: 72
Откуда: Москва
Благодарил (а): 4 раза
Поблагодарили: 5 раз
zazaka писал:да я хотел отделисть меню от основного класса интерфейса  чтобы потом легче было править.


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

Да правильно сам класс не нужно ни откого наследовать.
Сам класс должен только вернуть объект QMenuBar, который ты уже привяжешь к нужному окну
PQStudio Development Progress: 75%
Version: 0.2

WxMaper
Аватара пользователя
Администратор
 
Сообщения: 92
Благодарил (а): 8 раз
Поблагодарили: 4 раза
zazaka писал: а сам класс меню ниоткого наследовать не нужно? 


Твой класс можно унаследовать от самого меню, тогда и возвращать ничего не придется, просто создашь объект:

phpqt Код:
class MyMenuBar extends QMenuBar {
    public function __construct() {
        parent::__construct();
    }
}

class MainWindow extends QMainWindow {
    public function __construct() {
        parent::__construct();
       
        /* ... */
        $this->menuBar = new MyMenuBar;
    }
}

zazaka
Аватара пользователя
Ответственный глюкогенератор
 
Сообщения: 98
Поблагодарили: 2 раза
WxMaper

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

zazaka
Аватара пользователя
Ответственный глюкогенератор
 
Сообщения: 98
Поблагодарили: 2 раза
чтото получилось сделать только так вызывая меню 
Код:
$this->menuBar = new MyMenuBar($this);


и в самом классе меню 

phpqt Код:

public function __construct($forma)
    {
        parent::__construct();

        $this->menuBar = new QMenuBar($forma);

 иначе меню не появлялось 

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

Размер формы я не задавал!
Последний раз редактировалось zazaka 23 мар 2016, 19:39, всего редактировалось 1 раз.
Унабле то лоад дынамиц либрары

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


Изображение


Кстати поменял размер формы !  а меню как было урезанным так и осталось !(((

phpqt Код:
$this->resize(500, 200);
Унабле то лоад дынамиц либрары

zazaka
Аватара пользователя
Ответственный глюкогенератор
 
Сообщения: 98
Поблагодарили: 2 раза
каких только глюков я непонаделал ... 
всеголишь добавил строку 
Код:
set_tr_lang('ru');


зато каков эффект!!___ ))) 


Изображение

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

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

Так неправильно, потому что ты создаешь QMenuBar, родителем которого является окно. И менюбар добавляется не как менюбар, а как стандартный виджет:
phpqt Код:
private $menuBar;

private function initMenus() {
        $this->menuBar = new QMenuBar($this);


Правильно - 1 вариант (присоединяем QMenuBar к окну в качестве менюбара):
phpqt Код:
private $menuBar;

private function initMenus() {
        $this->menuBar = new QMenuBar;
        $this->setMenuBar($this->menuBar);


Правильно - 2 вариант (дело в том, что у QMainWindow есть св-во menuBar и переопределять его совсем не обязательно):
phpqt Код:
//private $menuBar;

private function initMenus() {
        $this->menuBar = new QMenuBar;
Почетный страдалец фигней
Пилю load_ui_file :good2:

WxMaper
Аватара пользователя
Администратор
 
Сообщения: 92
Благодарил (а): 8 раз
Поблагодарили: 4 раза
rinart73 писал:дело в том, что у QMainWindow есть св-во menuBar и переопределять его совсем не обязательно

Кстати, появилось это свойство относительно недавно :) 

zazaka писал:оно выглядит немного странным

Потому что ты нарушил структуру программы. Создавая меню, указываешь родителем один виджет и тут же это меню устанавливаешь другому виджету, вот оно у тебя и не отображается как надо.
На счет вопросиков - проверь кодировку файла переводом. Она должна быть такая же как и у файлов PHP - UTF-8

zazaka
Аватара пользователя
Ответственный глюкогенератор
 
Сообщения: 98
Поблагодарили: 2 раза
блин... 
я уже вроде всё перепробовал что вы писали 

в классе формы пишу 
phpqt Код:
private function initComponents()  
{     
 $this->centralWidget = new QWidget;
$this->menuBar = new MyMenuBar;
}


В классе меню пишу

phpqt Код:
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  пункт меню сделать
Последний раз редактировалось zazaka 24 мар 2016, 08:12, всего редактировалось 1 раз.
Унабле то лоад дынамиц либрары

WxMaper
Аватара пользователя
Администратор
 
Сообщения: 92
Благодарил (а): 8 раз
Поблагодарили: 4 раза
Вот переделанный пример стартового проекта QMainWindow:

phpqt Код:
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
Аватара пользователя
Ответственный глюкогенератор
 
Сообщения: 98
Поблагодарили: 2 раза
Супер_)  то что надо ! благодарю)
Унабле то лоад дынамиц либрары


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

Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость
cron