一些休息创造了奇迹,我现在得到了一些看起来足够好的东西。我希望这个答案可以在将来对任何人有所帮助。
它使用放置在 QGridLayout 内的 QFrame。在QGridLayout 上使用setRowStretch 可以解决问题中提到的对齐问题。使用的值可以调整,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
还有我的 mainwindow.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;
}