Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: k06a от Ноябрь 05, 2007, 14:26



Название: HTML на QPushButton
Отправлено: k06a от Ноябрь 05, 2007, 14:26
Недавно начал использовать библиотеку Qt, столкнулся с такой проблемой . . .
Возможно ли на QPushButton разместить HTML коды и теги как на QLabel?
Собственно нужна кнопка с интегралом на ней.
QPusnButton *but = new QPushButton("∫"); - На кнопке написано "int;"
QPusnButton *but = new QPushButton("&∫"); - На кнопке написано "∫"

Или может не QPushButton использовать, а что-нибудь другое? (Иконки на кнопках не предлагать)

// Qt4.2.0, MVS2005




Название: Re: HTML на QPushButton
Отправлено: Пантер от Ноябрь 05, 2007, 14:52
Экранировать, наверное, нужно. Т.к. знак & обеспечивает подчеркивание буквы на кнопке. Попробуйте или в теги взять, или чтото типа "\&int". К сожалению у меня сейчас нет возможности проверить.


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 05, 2007, 14:59
QPushButton *but = new QPushButton("\∫"); - На кнопке написано "int;"

К сожалению((


Название: Re: HTML на QPushButton
Отправлено: Пантер от Ноябрь 05, 2007, 15:05
Млин, а если "<p>&int</p>" или "<p>\&int</p>"?


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 05, 2007, 15:14
QPushButton *but = new QPushButton("<p>\&int</p>"); - На кнопке написано "<p>int</p>"
QPushButton *but = new QPushButton("<p>&int<p>"); - На кнопке написано "<p>int</p>"

QPushButton *but = new QPushButton("<p>\&int;</p>"); - На кнопке написано "<p>int;</p>"
QPushButton *but = new QPushButton("<p>&int;</p>"); - На кнопке написано "<p>int;</p>"


Название: Re: HTML на QPushButton
Отправлено: Пантер от Ноябрь 05, 2007, 15:44
Походу тогда никак. :( Хотя по ассистенту для отображения текста используется QLabel. Можно попробовать вставить символ юникода, если там есть интеграл.
Еще как вариант расположить на кнопке QLabel. :)


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 05, 2007, 16:34
В QLabel-то всё работает. А вот как QLabel на кнопку посадить?


Название: Re: HTML на QPushButton
Отправлено: Пантер от Ноябрь 05, 2007, 16:42
QLabel* label=new QLabel(button);
QVBoxLayout* layot=new QVBoxLayout;
layout->addWidget(label);
button->setLayout(layout);
Что-то типа того. Ассистента под рукой нет, так что не могу посмотреть есть ли у QPausButton setLayout.


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 05, 2007, 17:11
panter_dsd, ОгРоМнОе СпАсИбО!!))

Код записал так:
Код:
QPushButton *but = new QPushButton;
QHBoxLayout *lay = new QHBoxLayout(but);
lay->addWidget(new QLabel("<p>&int;</p>"));
Теперь на кнопке нарисован интеграл!
Теперь постараюсь ток его по горизонтали выровнять по центру . . .

// дописал
lay->setAlignment(Qt::AlignCenter); - вот и всё

Ещё раз спасибо)


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 05, 2007, 23:26
Из интересного решения проблемы вылезла новая проблема . . .

QPushButton *button = new QPushButton;
QHBoxLayout *layout = new QHBoxLayout(but);
QLabel *label = new QLabel("<p>&int;</p>");
layout->addWidget(label);
layout->setAlignment(Qt::AlignCenter);

Да, на кнопке нарисован интеграл (а на соседних ещё страшней значки)
Но для нажатия на кнопку необходимо попасть именно в QPushButton, а не в QLabel!!!
Это не так то просто . . .
У QLabel нет сигнала clicked() (и похожих) . . .
У QHBoxLayout - аналогично . . .

Возможно ли сделать QLabel видимым, но неосязаемым?
Чтобы кликать по нему, а попадать в QPushButton.

// Qt 4.2.0, MVS2005


Название: Re: HTML на QPushButton
Отправлено: pastor от Ноябрь 06, 2007, 00:11
Нарисуй свой класс кнопки на базе QLabel


Название: Re: HTML на QPushButton
Отправлено: pastor от Ноябрь 06, 2007, 00:24
Кстате, а разве через юникод кода не получаеться?

Код:
QPushButton *btn = new QPushButton(QString(0x222B));

Лично у меня такой код работает на ура (выводиться значок интеграла)


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 06, 2007, 00:54
pastor, точно, пасиб! Так намного проще)! А размер текста кнопки устанавливать можно как-нибудь? Щас нет возможности проверить . . .


Название: Re: HTML на QPushButton
Отправлено: pastor от Ноябрь 06, 2007, 01:03
Пробуй менять размер фонта


Название: Re: HTML на QPushButton
Отправлено: Tam-Tam от Ноябрь 06, 2007, 08:43
Попробовал выводить текст на кнопку через лейблу. Столкнулся с проблемой. Пока текст размера по умолчанию черного цвета, все нормально. Но если изменить хотя бы один параметр из вышеуказанных, то кнопка начинает вести себя неадекватно - нажимается не на каждый щелчок, иногда реагирует с задержкой, в редких случая нажимается и остаелся нажатой. Кто-нибудь сталкивался с таким ? Знает что за глюк ?


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 09, 2007, 23:37
Tam-Tam, всё из-за того што ты нажимаешь на QLabel, а не на QPushButton . . .

Символы юникода действительно нормально отображаются из QString.
А у меня так и не получается намутить на кнопке буковку с нижним индексом (произвольным) . . .


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 10, 2007, 00:01
Всё-таки нужен HTML . . .
А у QLabel нет сигнала клика по ней . . . проблема . . .


Название: Re: HTML на QPushButton
Отправлено: pastor от Ноябрь 10, 2007, 00:43
Всё-таки нужен HTML . . .
А у QLabel нет сигнала клика по ней . . . проблема . . .

Делаем тогда из QLabel кнопарь... :))
Наследуемся, выставляем параметры фрейма, чтобы лейбла была похожа на кнопку, реализовываем нужные сигналы и вперёд, юзаем полученый кнопарь ;) Я уже так когда-то делал


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 10, 2007, 15:57
реализовываем нужные сигналы и вперёд, юзаем полученый кнопарь ;)

С этого момента чуть подробнее . . . как их самому реализовать?
И хотелось бы потом добавить эллемент в группу Экшонов . . .


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 10, 2007, 16:23
Код:
class HTMLButton: public QLabel {
public:
HTMLButton(QString s):QLabel(s){
setFrameStyle(QFrame::Panel | QFrame::Raised);
setLineWidth(1);
}
};

А как сигналы назначить? У QFrame и QLabel их нет вообще . . .


Название: Re: HTML на QPushButton
Отправлено: Tam-Tam от Ноябрь 10, 2007, 17:58
Tam-Tam, всё из-за того што ты нажимаешь на QLabel, а не на QPushButton . . .

Тогда почему при стандартном тексте все пашет нормально ?

А как сигналы назначить? У QFrame и QLabel их нет вообще . . .

Как по мне не слишком удачная мысль реализовывать элемент исходя из элемента с совсем другой функциональность. Поскольку на кнопке также можно писать текст, то проще будет наследовать от кнопки и встроить "понимание" HTML. Правда как это сделать я тоже пока плохо себе представляю :)


Название: Re: HTML на QPushButton
Отправлено: Tam-Tam от Ноябрь 10, 2007, 18:00
Всё-таки нужен HTML . . .
А у QLabel нет сигнала клика по ней . . . проблема . . .

Всегда есть перехват событий.


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 10, 2007, 18:49
Вот так вот всё нормально пашет)) На кнопке(эл-т очень на неё похожий) действительно работает HTML . . . Теперь на кнопках и интегралы и нижние индексы и степени и т.д.

Код:
class HTMLButton: public QLabel, public QEvent {
public:
HTMLButton(QString name):
   QLabel(name),
           QEvent(MouseButtonPress)
{
  setAlignment(Qt::AlignCenter);
  setFrameStyle(QFrame::Panel | QFrame::Raised);
  setLineWidth(2); setMidLineWidth(2);
  setFixedSize(48,32);
}
protected:
void mousePressEvent(QMouseEvent *ev){
setFrameStyle(QFrame::Panel | QFrame::Sunken);
QLabel *lab = new QLabel("[Qt]");
                lab->show();
}
void mouseReleaseEvent(QMouseEvent *ev){
setFrameStyle(QFrame::Panel | QFrame::Raised);
}
};


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 10, 2007, 19:56
Tam-Tam, всё из-за того што ты нажимаешь на QLabel, а не на QPushButton . . .
Тогда почему при стандартном тексте все пашет нормально ?

А ты попробуй нажимать не в QLabel - тобишь в уголки и края кнопок, глюков нет))))
Ну стандартный то он стандартный, а не впихнутый насильно)


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 10, 2007, 20:05
Такой вопрос теперь.

setFrameStyle(QFrame::StyledPanel | QFrame::Raised); - очертаний кнопки не видно.
setFrameStyle(QFrame::Panel | QFrame::Raised); - а так видно.

Почему? Хотелось бы StyledPanel . . .
Но её не видно ни при каких параметрах толщинны бордюра . . .


Название: Re: HTML на QPushButton
Отправлено: pastor от Ноябрь 10, 2007, 23:47
Если честно, то получилась какае-то кривоватая реализация HTMLButton :)

Можно было сделать примерно так:

Код:
class HTMLButton: public QLabel {
    Q_OBJECT
public:
    HTMLButton(QWidget *parent = 0) : QLabel(parent) {
        setAlignment(Qt::AlignCenter);
        setFrameStyle(QFrame::Panel | QFrame::Raised);
        resize(75, 24);
    }

protected:
    virtual void mousePressEvent (QMouseEvent *event) {
        setFrameStyle(QFrame::Panel | QFrame::Sunken);
        emit pressed();
    }

    virtual void mouseReleaseEvent (QMouseEvent * event) {
        setFrameStyle(QFrame::Panel | QFrame::Raised);
        emit released();
        emit clicked();
    }

signals:
    void clicked();
    void pressed();
    void released();
};

Далее используем как обычную кнопку:

Код:
HTMLButton *btn = new HTMLButton(this);
connect(btn, SIGNAL(clicked()), this, SLOT(someslot()));

Впринципе класс можно наворотить дальше.

ЗЫ: не пинаёте больно, если кое-что забыл :)


Название: Re: HTML на QPushButton
Отправлено: pastor от Ноябрь 10, 2007, 23:49
Всегда есть перехват событий.

А какая проблема создать эти сигналы? :)


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 11, 2007, 01:17
Спасибо! Так конешно красивее код. Просто не знал как сигнал вызывать . . .
В книге об этом молчат вроде . . .


Название: Re: HTML на QPushButton
Отправлено: pastor от Ноябрь 11, 2007, 01:49
Могу предложить вот такой код:

Код:
class HTMLButton: public QPushButton {
    Q_OBJECT
public:
    HTMLButton(QWidget *parent = 0) : QPushButton(parent) {
        init();
    }

HTMLButton(const QString &text, QWidget *parent = 0) : QPushButton(text, parent) {
        init();
    }

protected:
virtual void paintEvent ( QPaintEvent *event )  {
QPainter painter(this);
QStyleOptionButton styleOps;
styleOps.initFrom(this);
styleOps.state = isDown() ? QStyle::State_Sunken : QStyle::State_Raised;
if (isDefault())
styleOps.features |= QStyleOptionButton::DefaultButton;
style()->drawControl(QStyle::CE_PushButton, &styleOps, &painter, this);

QAbstractTextDocumentLayout::PaintContext ctx;
ctx.palette = palette();
                       doc->setHtml(text());
doc->documentLayout()->draw(&painter, ctx);
}

private:
void init() {
doc = new QTextDocument(this);
}

private:
QTextDocument *doc;
};

имхо он лучше. Только вам прийдётся самому отцентровать текст в кнопке. Я подал идею, далее сами :)


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 11, 2007, 13:19
Такой вопрос теперь.
setFrameStyle(QFrame::StyledPanel | QFrame::Raised); - очертаний кнопки не видно.
setFrameStyle(QFrame::Panel | QFrame::Raised); - а так видно.
Почему? Хотелось бы StyledPanel . . .
Но её не видно ни при каких параметрах толщинны бордюра . . .

Почему StyledPanel не хочет отображаться??? Просто нет никакой кнопки, только HTML


Название: Re: HTML на QPushButton
Отправлено: pastor от Ноябрь 11, 2007, 13:36
Почему StyledPanel не хочет отображаться??? Просто нет никакой кнопки, только HTML

Отображение зависит от текущего стиля. Честно говоря, незнаю почему оно так отображаеться. При использование CDE и Motif стиля этобраджаеться нормально


Название: Re: HTML на QPushButton
Отправлено: k06a от Ноябрь 11, 2007, 17:39
Такое ощущение, что кнопки Flat.


Название: Re: HTML на QPushButton
Отправлено: pastor от Ноябрь 11, 2007, 19:00
Такое ощущение, что кнопки Flat.

Используй последний мною приведённый код, только раелизуй центровку текста