Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Нестандартная кнопка в Qml


Автор: vlarry 16.12.2015, 16:55
Добрый день, форумчане.
Подскажите пожалуйста, как можно сделать нестандартную кнопку в Qml, н-р по рисунку. Искал, но не нашел (или плохо искал). Спасибо.

Автор: ss 20.12.2015, 00:21
используй текстуру с альфа каналом.

посмотри стиль http://doc.qt.io/qt-5/qml-qtquick-controls-styles-buttonstyle.html#label-prop

или возьми image


Код

Image{
            id: idImg
            source: "img.png"
            MouseArea {
                anchors.fill: parent
                onEntered: {idImg.source = "imgDown.png"}
                onExited: {source: "img.png"}
            }
        }


в обработчики нажатия можно проверку поставить на нажатия в видимую область
Код

onEntered: { if !btnRect.onRect(mouseX, mouseX) return
                  // выполняем код ....
                   }


функ. onRect(mouseX, mouseX)  будет принимать координаты мыши и проверять альфу текстуры. Как добраться до данных текстуры? можно посмотреть http://doc.qt.io/qt-5/qml-qtquick-context2d.html#createImageData-method
или из с++ брать от текстуры и через указатель на класс обращаться к  функции в qml.

т.е. берем массив цветов текстуры или только альфа канал и проверяем если ноль то выдавать False - не обрабатывать клик


Код

class A : public QObject
{ Q_OBJECT
quint8 imageData[w][h];
void loadImg(){//загрузить текстуру и передать данные альфы в массив}

Q_INVOKABLE bool onRect(int x, int y){     return imageData[x][y]; }

//создадим класс где-нибудь. Например в main
A a;
//передадим ссылку на класс
engine.rootContext()->setContextProperty("btnRect",&a)


Автор: vlarry 21.12.2015, 17:23
Спасибо большое.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)