1

我正在尝试根据变量创建弹出菜单,如下所示:

    QMenu menu(widget);
    for(int i = 1; i <= kmean.getK(); i++)
    {
        stringstream ss;
        ss << i;
        string str = ss.str();
        string i_str = "Merge with " + str;
        QString i_Qstr = QString::fromStdString(i_str);
        menu.addAction(i_Qstr, this, SLOT(mergeWith1()));
    }
    menu.exec(position);

在哪里:

kmean.get(K)返回一个int值,

mergeWith1() is some `SLOT()` which works fine

问题:

该循环仅在i=1情况下在菜单上创建操作,并忽略 的其他值i

附加信息

int当使用临时值(没有 convert )进行相同的循环时,一切正常。例如 ,如果我只在循环中执行menu.addAction(i, this, SLOT(...)))并且我的K=4,将创建一个菜单,其中包含四个操作,相应地命名为 1、2、3、4。

可能是什么问题引起的

我认为问题出在转换部分,当我转换istringusingstringstream和之后转换为QString. 可能是价值以某种方式丢失了。我不知道。

问题:

  • 如何使循环接受转换部分?
  • 我在转换部分做错了什么?
4

1 回答 1

1
  1. 在 Qt 代码中,您不应该使用std::stringstreamor std::string。这是毫无意义。

  2. 通过将菜单放在堆栈上为其提供父级,您会遇到崩溃错误。它会被双重破坏。

  3. 不要使用同步阻塞方法,例如exec(). 使用 异步显示菜单popup()

  4. 为了对操作做出反应,请将插槽连接到菜单的triggered(QAction*)信号。这样你就可以处理任意数量的自动生成的动作。

  5. 您可以使用 Qt 属性系统来标记具有自定义属性的操作。毕竟QAction是一个,拥有所有的好处。QObject例如,您可以将索引存储在“索引”属性中。它是动态创建的。

这是一个如何做到这一点的完整示例。

主文件

#include <QApplication>
#include <QAction>
#include <QMenu>
#include <QDebug>
#include <QPushButton>

struct KMean {
    int getK() const { return 3; }
};

class Widget : public QPushButton
{
    Q_OBJECT
    KMean kmean;
    Q_SLOT void triggered(QAction* an) {
        const QVariant index(an->property("index"));
        if (!index.isValid()) return;
        const int i = index.toInt();
        setText(QString("Clicked %1").arg(i));
    }
    Q_SLOT void on_clicked() {
        QMenu * menu = new QMenu();
        int last = kmean.getK();
        for(int i = 1; i <= last; i++)
        {
            QAction * action = new QAction(QString("Merge with %1").arg(i), menu);
            action->setProperty("index", i);
            menu->addAction(action);
        }
        connect(menu, SIGNAL(triggered(QAction*)), SLOT(triggered(QAction*)));
        menu->popup(mapToGlobal(rect().bottomRight()));
    }
public:
    Widget(QWidget *parent = 0) : QPushButton("Show Menu ...", parent) {
        connect(this, SIGNAL(clicked()), SLOT(on_clicked()));
    }
};

int main (int argc, char **argv)
{
    QApplication app(argc, argv);
    Widget w;
    w.show();
    return app.exec();
}

#include "main.moc"
于 2013-09-05T21:56:47.020 回答