Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt4]QLabel вместо QPushButton, Сделать лэйбл c методом Click() 
V
    Опции темы
aspirin2003
Дата 5.6.2008, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Чтобы не создавать разные стили для кнопок, хочу использовать вместо них QLabel с различными картинками. Но у QLabel нет метода Click(), и поэтому я не знаю как быть.
Посоветуйте, что лучше сделать
PM MAIL   Вверх
anatox91
Дата 5.6.2008, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



может быть это тебе нужно(кнопка будет плоской, как лейбл):
Цитата

QPushButton::setFlat(bool);

можешь еще просто унаследоваться от QPushButton и перерисовывать кнопку при нажатии, наведении курсора и т.п. 
вот примерчик(можешь перерисовать под свои нужды, заменить картинки, изменить размеры)


Это сообщение отредактировал(а) anatox91 - 5.6.2008, 09:26

Присоединённый файл ( Кол-во скачиваний: 36 )
Присоединённый файл  button.rar 5,83 Kb


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Elfebet
Дата 5.6.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



не, вместо QPushButton юзай QToolButton, и вот ему сделай setRaise(true), ну и добавь картинку setIcon("картинка") - тогда будет выглядеть изначально как картинка, а при наведении мышой на кнопку.....  лучше сам посмотри smile, выгледит прикольно

а вот на счет лейбла, не так уж и трудно отнаследоваться от QLabel и сделать сигнал clicked();
QLabelEx.h
Код

#ifndef QLABELEX_H
#define QLABELEX_H

class QLabelEx : public QLabel
{
    Q_OBJECT
public:

    QLabelEx(QWidget *parent = 0);

    QLabelEx(const QString &Text, QWidget *parent = 0);

    ~QLabelEx();

    void setHoverText(bool bHover);

private:

    bool m_bHover;

    void enterEvent(QEvent *);

    void leaveEvent(QEvent *);

    void mouseReleaseEvent(QMouseEvent *);

signals:

    void clicked();
};
#endif


QLabelEx.cpp
Код

#include "QLabelEx.h"

QLabelEx::QLabelEx(QWidget *parent) : QLabel(parent)
{
    m_bHover = false;
    setCursor(Qt::PointingHandCursor);
}

QLabelEx::QLabelEx(const QString &Text, QWidget *parent) : QLabel(Text, parent)
{
    m_bHover = false;
    setCursor(Qt::PointingHandCursor);
}

QLabelEx::~QLabelEx()
{
}

void QLabelEx::setHoverText(bool bHover)
{
    m_bHover = bHover;
}

void QLabelEx::enterEvent(QEvent *)
{
    if( m_bHover )
    {
        QFont font = this->font();
        font.setUnderline(m_bHover);
        setFont(font);
    }
}

void QLabelEx::leaveEvent(QEvent *)
{
    if( m_bHover )
    {
        QFont font = this->font();
        font.setUnderline(false);
        setFont(font);
    }
}

void QLabelEx::mouseReleaseEvent(QMouseEvent *)
{
    emit clicked();
}



--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
aspirin2003
Дата 5.6.2008, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Всем спасибо за ответы, подходы очень интересные smile
PM MAIL   Вверх
aspirin2003
Дата 5.6.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(Elfebet @ 5.6.2008,  09:26)
не, вместо QPushButton юзай QToolButton...

Только пока не пойму, почему то в Вашем коде не работают методы enterEvent и leaveEvent
PM MAIL   Вверх
Elfebet
Дата 5.6.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



такого быть не может, enterEvent и leaveEvent работают для всех виджетов


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
anatox91
Дата 5.6.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



aspirin2003, проще использовать приведенный мною готовый код, и только позаменять картинки и/или размеры  smile 


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
aspirin2003
Дата 5.6.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(anatox91 @ 5.6.2008,  14:07)
aspirin2003, проще использовать приведенный мною готовый код, и только позаменять картинки и/или размеры  smile

Вот попробовал Ваш код. Немного изменил класс TabButton и почему то вокруг кнопки получилась какая-то разноцветная фигня. Посмотрите, пожалуйста, почему так выходит

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  button_pixmap.rar 9,15 Kb
PM MAIL   Вверх
aspirin2003
Дата 5.6.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(Elfebet @ 5.6.2008,  13:54)
такого быть не может, enterEvent и leaveEvent работают для всех виджетов

Посмотрите, тогда, пожалуйста, что не я сделал не так

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  label_button.rar 8,98 Kb
PM MAIL   Вверх
Elfebet
Дата 5.6.2008, 16:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



Цитата

Посмотрите, тогда, пожалуйста, что не я сделал не так


Во первых в enterEvent и leaveEvent есть условие
Код

if( m_bHover )
{
......
}

а она в конструкторе изначально установлена в false, поэтому не выполняется (поставь в true)

Во вторых ты в leaveEvent не присваиваеш картинку начального вида

и в третьих
Цитата

aspirin2003, проще использовать приведенный мною готовый код, и только позаменять картинки и/или размеры   



--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
anatox91
Дата 5.6.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



Цитата(aspirin2003 @  5.6.2008,  14:45 Найти цитируемый пост)
Вот попробовал Ваш код. Немного изменил класс TabButton и почему то вокруг кнопки получилась какая-то разноцветная фигня. Посмотрите, пожалуйста, почему так выходит

я не знаю, какие картинки ты подставлял вместо моих, я тебе показал лишь пример: в paintEvent всегда рисуем с QImage, а в остальных обработчиках событий рисуем на QImage(он в качестве контекста рисования) и перерисовываем с помощью repaint();
единственно что я забыл, это надо добавить еще такую функцию(размеры также можешь изменить под свои)
Код

virtual QSize sizeHint() const {
return QSize(16, 16); //тут подставляй свои размеры
}


P.S.я вообще делал эту кнопочку для закрытия текущей вкладки в QTabWidget'e, но думаю идею поймешь


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
aspirin2003
Дата 6.6.2008, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Цитата(anatox91 @ 5.6.2008,  18:04)
я не знаю, какие картинки ты подставлял вместо моих, я тебе показал лишь пример: в paintEvent всегда рисуем с QImage, а в остальных обработчиках событий рисуем на QImage(он в качестве контекста рисования) и перерисовываем с помощью repaint();

P.S.я вообще делал эту кнопочку для закрытия текущей вкладки в QTabWidget'e, но думаю идею поймешь

Принцип я понял. Картинки, как было показано во вложении в моем ответе на Ваш предыдущий пост, я использовал именно Ваши, без каких-либо изменений. Я изменил по сути лишь класс TabButton, добавив в его конструктор 3 параметра QImage (чтобы не создавать каждый раз новый класс для каждой новой кнопки с разными картинками). После этого работа программы практически не изменилась за исключением того, что вокруг кнопки появилась какая то разноцветная фигня шириной около пикселя. Получается некрасиво.
Код

TabButton::TabButton(QImage &pix_main, QImage &pix_hover, QImage &pix_pressed, QWidget* parent) : QPushButton(parent), source(16, 16, QImage::Format_ARGB32_Premultiplied)


Добавлено через 11 минут и 13 секунд
Цитата(Elfebet @ 5.6.2008,  16:53)
Во первых в enterEvent и leaveEvent есть условие
Код

if( m_bHover )
{
......
}

а она в конструкторе изначально установлена в false, поэтому не выполняется (поставь в true)

Так работает, спасибо
PM MAIL   Вверх
aspirin2003
Дата 6.6.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



И все-таки, anatox91, не могли бы Вы посмотреть, почему вокруг кнопки появляется цветной муар, когда немного изменяю конструктор TabButton? Сорри, уже наверное замучил, но все же ...
PM MAIL   Вверх
anatox91
Дата 6.6.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



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


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
aspirin2003
Дата 13.6.2008, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 111
Регистрация: 18.3.2007
Где: Саратов

Репутация: нет
Всего: нет



Вот что у меня получилось в первом приближении:
TabButton.h
Код

#ifndef TABBUTTON_H_
#define TABBUTTON_H_
#include <QPushButton>
#include <QPixmap>
class QWidget;
class QPaintEvent;
class QMouseEvent;
class QEvent;
class QImage;

class TabButton : public QPushButton
{
      Q_OBJECT
public:
   //TabButton(QImage &pix_main, QImage &pix_hover, QImage &pix_pressed, QWidget *parent=0);
  TabButton(QString &str, QImage &pix_main, QImage &pix_hover, QImage &pix_pressed, QWidget *parent=0);
protected:
   virtual void paintEvent(QPaintEvent *event); //рисуем по sourc'y
   virtual void mousePressEvent(QMouseEvent *event); //отрисовываем в source 
   virtual void mouseReleaseEvent(QMouseEvent *event); //отрисовываем в source 
   virtual void enterEvent(QEvent *event);  //отрисовываем в source 
   virtual void leaveEvent(QEvent *event);  //отрисовываем в source
private:
   QImage source;
   QImage p_main, p_hover, p_pressed;
};

#endif //TABBUTTON_H_


TabButton.cpp
Код

#include "TabButton.h"
#include <QtGui>

TabButton::TabButton(QString &str, QImage &pix_main, QImage &pix_hover, QImage &pix_pressed, QWidget* parent) : QPushButton(str, parent), source(pix_main.size().width(), pix_main.size().height(), QImage::Format_ARGB32_Premultiplied)
{
   int p_width = pix_main.size().width();
   int p_height = pix_main.size().height();
   setFixedSize(QSize(p_width, p_height));
   QPainter painter(&source);
   p_main = pix_main;
   p_hover = pix_hover;
   p_pressed = pix_pressed;
   QColor col = parent->palette().color(QPalette::Background);
   painter.setBrush(QBrush(col));
   painter.drawRect(x(), y(), p_width, p_height);
   painter.drawImage(0, 0, p_main);
}

void TabButton::paintEvent(QPaintEvent *event)
{
     QPainter painter(this);
     painter.setRenderHint(QPainter::Antialiasing, true);
     painter.drawImage(0, 0, source);
}

void TabButton::mousePressEvent(QMouseEvent *event)
{
     QPainter painter(&source);
     painter.drawImage(0, 0, p_pressed);
     repaint();
}

void TabButton::enterEvent(QEvent *event)
{
     QPainter painter(&source);
     painter.drawImage(0, 0, p_hover);
     repaint();
}

void TabButton::leaveEvent(QEvent *event)
{
     QPainter painter(&source);
     painter.drawImage(0, 0, p_main);
     repaint();
}

void TabButton::mouseReleaseEvent(QMouseEvent *event)
{
     QPainter painter(&source);
     painter.drawImage(0, 0, p_hover);
     repaint();
}


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

Это сообщение отредактировал(а) aspirin2003 - 13.6.2008, 21:00
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1383 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.