Russian Qt Forum
Сентябрь 30, 2024, 18:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с кастомными контролами в менюбаре  (Прочитано 4064 раз)
korel
Гость
« : Октябрь 21, 2010, 10:58 »

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

Сейчас, что я пытался сделать:
В дизайнере выбрасываю на форму контролы, после этого создаю лейаут, и в него добавляю эти виджеты. Лейаут в свою очередь кидаю QWidget_у и дальше для мейн виндова setMenuWidget(&m_widget)

Но кнопки отображаются срезаными по высоте.

А если, просто, кнопку, без помещения ее в лейаут, запиндюрить setMenuWidget(ui.customButton) - то она отображается так как мне нужно.

Может кто-то знает, что нужно делать, чтобы создать адекватный менюбар?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Октябрь 21, 2010, 11:05 »

Цитировать
А если, просто, кнопку, без помещения ее в лейаут, запиндюрить setMenuWidget(ui.customButton) - то она отображается так как мне нужно.
Ответ сам напрашивается - смотри лейаут - что-то там не так.
Записан

Qt 5.11/4.8.7 (X11/Win)
korel
Гость
« Ответ #2 : Октябрь 21, 2010, 11:46 »

Да - в лейауте дело. Я это уже обнаружил. Попробовал еще до того как добалсять виджеты
m_menu_layout.setGeometry(QRect(0, 0, 600, 200)); - таким способом хотел ресайзить лейаут. Но по прежнему виджеты в лейауте отображаются не полность (срезану по высоте).

Вообще сейчас попал в какой-то тупик.... Непонимающий
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Октябрь 21, 2010, 11:51 »

Без кода здесь вам никто не поможет.
Записан

Qt 5.11/4.8.7 (X11/Win)
korel
Гость
« Ответ #4 : Октябрь 21, 2010, 12:04 »

Код:
TestControl::TestControl(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags), mp_menu(new QMenu)
{
  ui.setupUi(this);
 
  ui.customButton->SetActiveStatePath("D:\\private\\dev\\SignatureQt\\images\\load_plan_active.png");
  ui.customButton->SetNormalStatePath("D:\\private\\dev\\SignatureQt\\images\\load_plan_normal.png");

  ui.customButton_2->SetActiveStatePath("D:\\private\\dev\\SignatureQt\\images\\help_active.png");
  ui.customButton_2->SetNormalStatePath("D:\\private\\dev\\SignatureQt\\images\\help_normal.png");

  ui.customButton_3->SetActiveStatePath("D:\\private\\dev\\SignatureQt\\images\\plan_options_active.png");
  ui.customButton_3->SetNormalStatePath("D:\\private\\dev\\SignatureQt\\images\\plan_options_normal.png");


  m_menu_layout.addWidget(ui.customButton);
  m_menu_layout.addWidget(ui.customButton_2);
  m_menu_layout.addWidget(ui.customButton_3);
  m_menu_widget.setLayout(&m_menu_layout);

   
  m_menu_widget.resize(m_menu_widget.width(), ui.customButton->height());
  setMenuWidget(&m_menu_widget);
}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Октябрь 21, 2010, 12:08 »

Ну, а остальное где?
Записан

Qt 5.11/4.8.7 (X11/Win)
korel
Гость
« Ответ #6 : Октябрь 21, 2010, 12:14 »

 Крутой - вот еще код кастомной кнопки - которую я в нескольких экземплярах ложу в лейаут

Код:
#ifndef CUSTOMBUTTON_H
#define CUSTOMBUTTON_H

#include <QtGui/QAbstractButton>
#include <QtDesigner/QDesignerExportWidget>

class QMenu;
 
class QDESIGNER_WIDGET_EXPORT CustomButton : public QAbstractButton
{
    Q_OBJECT

public:
    CustomButton(QWidget *parent = 0);
    ~CustomButton();

    QSize sizeHint() const;

    void SetMenu(QMenu* i_menu);
    void ShowMenu() const;
    void AddActions(QList<QAction*> i_actions);

    const QString& GetActiveStatePath() const;
    const QString& GetNormalStatePath() const;
    void SetNormalStatePath(const QString& i_path);
    void SetActiveStatePath(const QString& i_path);

    bool IsActive() const;

public slots:
    void ChangeState();//todo

protected:
    void paintEvent(QPaintEvent *e);
    void mouseReleaseEvent(QMouseEvent* e);
    //????????????????????????????????????????????????????????????????????????????????
    void mousePressEvent(QMouseEvent* e);//todo check for needing of this event method
    //????????????????????????????????????????????????????????????????????????????????
    void enterEvent(QEvent*);
    void leaveEvent(QEvent*);

private:
    bool m_is_active;
    QString m_normal_state_path;
    QString m_active_state_path;   
    QMenu* mp_menu;

//????????????????????????????????????????????????????????????????????????????????????
signals:
    void mousePressed();
    void mouseReleased();//todo check
  };

#endif // CUSTOMBUTTON_H

Код:
#include "custombutton.h"

#include <QMenu>
#include <QPainter>
#include <QtCore>
#include <QObject>
#include <QMouseEvent>
#include <QImage>
#include <QtGui/QMessageBox>

CustomButton::CustomButton(QWidget *parent) : QAbstractButton(parent), m_is_active(false), mp_menu(NULL)
  {}

CustomButton::~CustomButton()
  {}

QSize CustomButton::sizeHint() const
{
return QSize(fontMetrics().width(text()) + 10,
             fontMetrics().height() + 10);
}

void CustomButton::SetMenu(QMenu* i_menu)
{
    mp_menu = i_menu;
}

void CustomButton::ShowMenu() const
{
    long offset_x = 2, offset_y = 2;//todo magic numbers
    QPoint pop_up_point(this->pos().x() - offset_x,
                        this->pos().y() + height());// + offset_y);
    mp_menu->popup(this->mapToGlobal(pop_up_point));//this->mapToGlobal(QPoint(0, 0));
}

void CustomButton::AddActions(QList<QAction*> i_actions)
{
    if(!i_actions.isEmpty())
        mp_menu->addActions(i_actions);
}

/////////////////////////////////////////////////////////////

void CustomButton::SetNormalStatePath(const QString& i_path)
  {
  m_normal_state_path = i_path;
  }

void CustomButton::SetActiveStatePath(const QString& i_path)
  {
  m_active_state_path = i_path;
  }

const QString& CustomButton::GetActiveStatePath() const
  {
  return m_active_state_path;
  }

const QString& CustomButton::GetNormalStatePath() const
  {
  return m_normal_state_path;
  }

bool CustomButton::IsActive() const
  {
  return m_is_active;
  }

void CustomButton::ChangeState()
  {
  m_is_active = !m_is_active;
  }

/////////////////////////////////////////////////////////////

void CustomButton::paintEvent(QPaintEvent* e)
{
    QPainter painter(this);
    QImage image;

    if(m_is_active)
      image.load(m_active_state_path);
    else
      image.load(m_normal_state_path);

    resize(image.width(), image.height());
    painter.drawImage(0/*pos().x()*/, 0/*pos().y()*/, image);
}

void CustomButton::enterEvent(QEvent*)
{
m_is_active = true;
}

void  CustomButton::leaveEvent(QEvent*)
{
m_is_active = false;
}

void CustomButton::mouseReleaseEvent(QMouseEvent* e)
{
    if(e->button() == Qt::LeftButton)
    {
        m_is_active = false;
        emit mouseReleased();//todo check
        repaint(rect());
        if(mp_menu)
            ShowMenu();
    }
}

//????????????????????????????????????????????????
void CustomButton::mousePressEvent(QMouseEvent* e)
  {
  emit mousePressed();
  }

Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Октябрь 21, 2010, 12:24 »

Мде...
Создавать иконку при отрисовке кнопки и там же изменять её размер это ... хм... вообщем я промолчу...
Почему в конструкторе кнопки не загрузить иконки и хранить их в статических свойствах класса? Чем для этого не подошел QIcon?
Соответсвенно неправильный sizeHint().
« Последнее редактирование: Октябрь 21, 2010, 12:33 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
korel
Гость
« Ответ #8 : Октябрь 21, 2010, 12:35 »

Мде...
Создавать иконку при отрисовке кнопки и там же изменять её размер это ... хм... вообщем я промолчу...

я об этом знал с самого начала. Просто задача стояла - очень быстро набросать... От пока этот код - набросок.
т.е. я это держу в памяти - что нужно пофиксить)))

Почему в конструкторе кнопки не загрузить иконки и хранить их в статических свойствах класса.
Соответсвенно неправильный sizeHint().

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


А на счет sizeHint() - он неправильный потому, что отталкиваюсь от размера шрифта, а нужно от размера иконки. Что то в таком роде?

Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Октябрь 21, 2010, 12:42 »

Цитировать
я об этом знал с самого начала. Просто задача стояла - очень быстро набросать... От пока этот код - набросок.
т.е. я это держу в памяти - что нужно пофиксить)))
В корне неправильный подход.
Дело в том что в событии отрисовки вы генерите событие изменения размера, которое в свою очередь тоже генерит событие отрисовки.
Спасибо Qt, что от такого изнасилования он не ушел в рекусию и не шлёпнулся.
Такие вещи нельзя делать даже в набросках.
Соответственно из-за всего этого у вас проблемы с компоновкой.
Записан

Qt 5.11/4.8.7 (X11/Win)
korel
Гость
« Ответ #10 : Октябрь 21, 2010, 13:44 »

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

 Я исправлю все!!! Спасибо за консультацию.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.089 секунд. Запросов: 23.