Я пытаюсь создать в Qt последовательность пользовательских кнопок со стрелкой, но я не смог найти способ. Мне нужно что-то вроде кнопок, которые вы можете видеть на следующем рисунке, чтобы управлять рабочим процессом моей программы и направлять пользователя по нему. Тексты изображений должны быть "Шаг 1", "Шаг 2" и "Шаг 3" . Извините за ошибку. Любая помощь или предложение приветствуются. Спасибо за вашу помощь.
Как создавать кнопки с нестандартными формами в QT
Ответы:
заголовочный файл:
public:
void paintEvent(QPaintEvent* event); //--> drawing triangles
void createPushButtons();
const static int firstButtonX = 0; //--> topleft corner x value of first button
const static int firstButtonY = 0; //--> topleft corner y value of first button
const static int buttonWidth = 50;
const static int buttonHeight = 30;
const static int triangleWidth = 30;
QList<QColor> colors; //--> button colors
СРР-файл:
Я заполняю список цветов цветами кнопок.
colors.append(Qt::red);
colors.append(Qt::blue);
colors.append(Qt::yellow);
и вызовите функцию createPushButtons();
для создания кнопок.
void MainWindow::createPushButtons()
{
QWidget * wdg = new QWidget(this);//--> widget contains pushButtons
wdg->setObjectName("buttonWidget");//--> I set object name in order to catch widget and pushButtons in PaintEvent()
setCentralWidget(wdg);//--> I add widget to app main layout
for(int i=0; i<colors.size(); i++)//--> Button count and color count must be same.
{
QPushButton *btn = new QPushButton(QString::number(i)+". button",wdg);//--> create pushButtons in parent wdg
btn->setGeometry(firstButtonX + (buttonWidth+triangleWidth)*i, firstButtonY, buttonWidth, buttonHeight);//--> I set geometry for pushButtons
btn->setStyleSheet(QString("background-color: %1;border-style: outset;border-width: 0px;").arg(colors.at(i).name()));//--> I change background color and clear border
}
}
void MainWindow::paintEvent(QPaintEvent *event)
{
QWidget *wdg = findChild<QWidget *>("buttonWidget");//--> I catch my widget
QList<QPushButton *> buttons = wdg->findChildren < QPushButton *>();//--> I find pushButtons
for(int i=0;i < buttons.size(); i++)
{
int x = buttons.at(i)->pos().x();//--> measurements for triangle
int y = buttons.at(i)->pos().y();
int w = buttons.at(i)->width();
int h = buttons.at(i)->height();
QRect r(x+w,y,triangleWidth,h);//--> I create rectangular area between pushButtons
QPainter painter(this);
qreal point3X = x+w + triangleWidth;//--> triangle corners
qreal point3Y = y + h/2 ;
qreal point1X = x+w;
qreal point1Y = y;
qreal point2X = x+w;
qreal point2Y = y+h;
QPainterPath path;
path.moveTo (point1X, point1Y);
path.lineTo (point2X, point2Y);
path.lineTo (point3X, point3Y);
painter.setPen (Qt :: NoPen);
if(i != buttons.size()-1)//--> I paint rectangular and triangle
{
painter.fillRect(r, QBrush (colors.at(i+1)));
}
painter.fillPath (path, QBrush (colors.at(i)));
}
}
результат
Если вы не хотите рисовать всю картину самостоятельно, вы можете использовать три обычных QPushButtons
с setIcon()
, чтобы содержать вашу пользовательскую графику, разделенную на три части, как при установке свойства flat
в значение true.
Вероятно, потребуется сгруппировать их в родительском виджете, чтобы контролировать их положение и размеры, в зависимости от вашего макета.
Вы можете использовать один виджет вместо дерева и рисовать содержимое (шаг 1, шаг 2...) в функции paintEvent()
виджета. При щелчке мышью (или другом) событии вы можете вычислить, на какой из виртуальных кнопок произошло событие, и выполнить соответствующее действие.