C++ 传递标准枚举值
我正在编写一个toast风格的messagebox,但我无法直接传递标准图标。下面的开关可以工作,但太笨重了。这样做的正确方法是什么,这样我就可以摆脱开关选择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);
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你一直都是对的。我错了,多年来一直如此,我写的所有这些引用枚举的参数。事实证明,我这样做只会带来明显的好处。:-)