Некоторый отдых творил чудеса, и сейчас у меня есть кое-что, что выглядит достаточно хорошо. Я надеюсь, что этот ответ может помочь любому в будущем.
Он использует QFrame, помещенный внутри QGridLayout. Использование setRowStretch
на QGridLayout
устраняет проблему с выравниванием, упомянутым в вопросе. Используемые значения могут быть изменены, 25 - немного-много. Но я не совсем уверен, как это работает, поэтому я пока оставлю все как есть.
Также используется eventFilter
для захвата щелчка левой кнопкой мыши по кадру.
Ниже моего файла mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class QFrame;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QImage *img = new QImage(":/all/Folder-1.svg");
QPixmap p = QPixmap::fromImage(*img);
QFrame *CreateNewRow(int number, QString title, QString subtitle, QString mouseReleaseValue, int generalFontSize=18);
protected:
bool eventFilter(QObject *obj, QEvent *event) override;
};
#endif // MAINWINDOW_H
И моего главного окна . cpp файл:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLabel>
#include <QGridLayout>
#include <QMouseEvent>
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QFrame *row1 = CreateNewRow(1, "First row", "First subtitle row", "row_1");
QFrame *row2 = CreateNewRow(2, "Second row", "Second subtitle row", "row_2");
QGridLayout *mainLayout = new QGridLayout();
// All rows no stretch
// Not sure about the magic numbers, but it works..
mainLayout->setRowStretch(25, 25);
mainLayout->addWidget(row1, 0, 0);
mainLayout->addWidget(row2, 1, 0);
ui->mainFrame->setLayout(mainLayout);
}
QFrame* MainWindow::CreateNewRow(int number, QString title, QString subtitle, QString mouseReleaseValue, int generalFontSize)
{
QString styleFrame = QString("*:hover {background: #F6F6F6;}");
QString styleNumber = QString("font-size: %1px; color: #8B8D8F;").arg(qRound(generalFontSize * 0.7));
QString styleTitle = QString("font-size: %1px; color: #5CAA15;").arg(generalFontSize);
QString styleSubtitle = QString("font-size: %1px; color: #8B8D8F;").arg(qRound(generalFontSize * 0.7));
QFrame *frame = new QFrame();
frame->setStyleSheet(styleFrame);
frame->setCursor(Qt::PointingHandCursor);
frame->installEventFilter(this);
frame->setProperty("mouseReleaseValue", mouseReleaseValue);
QLabel *imgDisplayLabel = new QLabel("");
imgDisplayLabel->setPixmap(p.scaled(generalFontSize, generalFontSize, Qt::KeepAspectRatio));
imgDisplayLabel->adjustSize();
imgDisplayLabel->setContentsMargins(5, 0, 10, 0);
QGridLayout *layout= new QGridLayout(frame);
// All rows no stretch
// Not sure about the magic numbers, but it works..
layout->setColumnStretch(25, 25);
QLabel *labelNumber = new QLabel(QString::number(number));
QLabel *labelTitle = new QLabel(title);
QLabel *labelSubtitle = new QLabel(subtitle);
labelNumber->setStyleSheet(styleNumber);
labelTitle->setStyleSheet(styleTitle);
labelSubtitle->setStyleSheet(styleSubtitle);
layout->addWidget(labelNumber, 0, 0);
layout->addWidget(imgDisplayLabel, 0, 1, Qt::AlignVCenter);
layout->addWidget(labelTitle, 0, 2);
layout->addWidget(labelSubtitle, 1, 2);
return frame;
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent* mouseEvent = static_cast<QMouseEvent*> (event);
if (mouseEvent->button() == Qt::LeftButton) {
QString prop = obj->property("mouseReleaseValue").toString();
QMessageBox msgBox;
msgBox.setText(QString("You have clicked an object with mouseReleaseValue: %1.").arg(prop));
msgBox.exec();
return true;
}
}
// standard event processing
return QObject::eventFilter(obj, event);
}
MainWindow::~MainWindow()
{
delete ui;
}