用于 IOS 开发的 QMessagebox 的任何替代解决方案(仅限 QWidget 应用程序)?

2023-11-30

我正在使用 Qt 5.3 并尝试为 IOS 开发应用程序。

问题是,iPhone Retina 模拟器中的 QWidget 应用程序:

  1. QMessage 变为全屏。
  2. 在应用程序输出面板中我看到:此插件不支持 传播大小提示()。

因此正在寻找 QMessageBox 的替代解决方案。我还不想学习 QML。


如果你在你的小部件顶部做一个覆盖,你可以制作类似于 iOS 弹出窗口的东西。

基本上,您创建另一个小部件,并将其作为您希望在其上绘制的小部件的父级。

以下是一些可以放入覆盖构造函数中的有用标志和代码行:

setPalette(Qt::transparent);
// if you have buttons on this overlay you probably don't want this one
setAttribute(Qt::WA_TransparentForMouseEvents);

QGraphicsDropShadowEffect * dse = new QGraphicsDropShadowEffect();
dse->setBlurRadius(20);
this->setGraphicsEffect(dse);

然后,请确保在父窗口小部件调整大小时命令调整覆盖层的大小:

void ParentWidget::resizeEvent(QResizeEvent *event)
{
    overlay->resize(event->size());
    event->accept();
}

http://www.qtcentre.org/wiki/index.php?title=Widget_Overlay

更新:很棒的例子

screenshot of overlay messagebox

main.cpp

#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    w.resize(300,600);

    return a.exec();
}

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "overlaydialogbox.h"
#include <QResizeEvent>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void resizeEvent(QResizeEvent *event);

private:
    OverlayDialogBox * m_overlay;
};

#endif // MAINWINDOW_H

主窗口.cpp

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    m_overlay = new OverlayDialogBox(this);
}

MainWindow::~MainWindow() { }

void MainWindow::resizeEvent(QResizeEvent *event)
{
    m_overlay->resize(event->size());
    event->accept();
}

覆盖对话框.h

#ifndef OVERLAYDIALOGBOX_H
#define OVERLAYDIALOGBOX_H

#include <QWidget>

class OverlayDialogBox : public QWidget
{
    Q_OBJECT
public:
    explicit OverlayDialogBox(QWidget *parent = 0);

signals:
    void accepted();
    void rejected();
    void finished(int);
public slots:
};

#endif // OVERLAYDIALOGBOX_H

覆盖对话框.c++

#include "overlaydialogbox.h"
#include <QGridLayout>
#include <QGraphicsEffect>
#include <QLabel>
#include <QDialogButtonBox>
#include <QMessageBox>
#include <QIcon>

OverlayDialogBox::OverlayDialogBox(QWidget *parent) :
    QWidget(parent)
{
    setPalette(Qt::transparent);
    // if you have buttons on this overlay you probably don't want this one
//    setAttribute(Qt::WA_TransparentForMouseEvents);

    QGraphicsDropShadowEffect * dse = new QGraphicsDropShadowEffect();
    dse->setBlurRadius(20);
    this->setGraphicsEffect(dse);

    QGridLayout * grid = new QGridLayout();
    this->setLayout(grid);

    QMessageBox * msg = new QMessageBox(QMessageBox::Warning,"Testing","This is a test QMessageBox.");
    QObject::connect(msg, SIGNAL(accepted()), this, SIGNAL(accepted()));
    QObject::connect(msg, SIGNAL(finished(int)), this, SIGNAL(finished(int)));
    QObject::connect(msg, SIGNAL(rejected()), this, SIGNAL(rejected()));
    QObject::connect(msg, SIGNAL(finished(int)), this, SLOT(close()));

    msg->setPalette(Qt::white);

    grid->addWidget(msg);
}

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于 IOS 开发的 QMessagebox 的任何替代解决方案(仅限 QWidget 应用程序)? 的相关文章

随机推荐