C++ 传递标准枚举值

C++ 传递标准枚举值,c++,qt,C++,Qt,我正在编写一个toast风格的messagebox,但我无法直接传递标准图标。下面的开关可以工作,但太笨重了。这样做的正确方法是什么,这样我就可以摆脱开关选择 void MainWindow::mtoast(int msgtime,int level, QString msg) { QMessageBox *mbox = new QMessageBox; mbox->setStandardButtons(0); mbox->setText(msg);

我正在编写一个toast风格的messagebox,但我无法直接传递标准图标。下面的开关可以工作,但太笨重了。这样做的正确方法是什么,这样我就可以摆脱开关选择

void MainWindow::mtoast(int msgtime,int level, QString msg)
{
    QMessageBox *mbox = new QMessageBox;
    mbox->setStandardButtons(0);
    mbox->setText(msg);

    switch(level){
        case 0:
            mbox->setIcon(QMessageBox::NoIcon);
            break;
        case 1:
            mbox->setIcon(QMessageBox::Question);
            break;
        case 2:
            mbox->setIcon(QMessageBox::Information);
            break;
        case 3:
            mbox->setIcon(QMessageBox::Warning);
            break;
        case 4:
            mbox->setIcon(QMessageBox::Critical);
            break;
    }


    mbox->setWindowFlags ( Qt::CustomizeWindowHint | Qt::WindowTitleHint);
    mbox->show();
    QTimer::singleShot(msgtime, mbox, SLOT(hide()));

}

更改函数签名,使其接受对的引用作为第二个参数,而不是
int-level
。大概是这样的:

void MainWindow::mtoast(int msgtime, const enum QMessageBox::Icon& icon, QString msg)
{
    QMessageBox *mbox = new QMessageBox;
    mbox->setStandardButtons(0);
    mbox->setText(msg);
    mbox->setIcon(icon); //this statement replaces the entire switch
    mbox->setWindowFlags ( Qt::CustomizeWindowHint | Qt::WindowTitleHint);
    mbox->show();
    QTimer::singleShot(msgtime, mbox, SLOT(hide()));

}

当你说你不能正确传递图标是什么意思?我的意思是我不能直接传递一个值到mbox->setIcon。它需要mbox->setIcon(QMessageBox::);。我如何将QMessageBox::作为参数传递?@Alan这不正是我的答案所显示的方法吗?是的,它非常有效。我不知道为什么它被否决了。我接受了它作为我的答案。旁注:通过引用传递
enum
没有任何好处。@kefir500通过引用传递值的好处是,我们明确了函数接受的内容-对enum本身实例的引用。如果按值传递,则调用方可以通过将其强制转换为枚举类型(如
(QMessageBox::Icon(384))
来传递任意整数值,而不考虑384是否是枚举中的有效值(在我们的示例中不是这样)。但是,如果它是引用变量,则无法编译,调用方必须将有效引用传递给枚举实例。可能我误解了您的意思,但编译时没有任何错误。你能提供一个例子吗?@kefir500你一直都是对的。我错了,多年来一直如此,我写的所有这些引用枚举的参数。事实证明,我这样做只会带来明显的好处。:-)