1

私は非常に具体的な問題を抱えているので、できるだけ明確にしようとしています。

QTabWidgetを含むを持っています。QTableWidget私のすべての行はQTableWidget、ファイルを読み取ることによって動的に作成されます。

マイタブ

ご覧のとおり、行を作成するときはqCheckBox、末尾に a を追加します。私の目標は、クリックしたときにこの行をQTableWidget私の最後のタブに送信し、チェックを外すとこの行を削除することです。QtableTabqCheckBoxqCheckBox

したがって、ラインを動的に作成するたびにqCheckBox、シグナルに関連付けようとします。

QObject::connect(pCheckBox, SIGNAL(clicked()),  this, SLOT(cliqueCheckBox(monTab,ligne, pCheckBox)));

しかし、それはうまくいきません、私はエラーを持っています:

QObject::connect: No such slot supervision::cliqueCheckBox(monTab,ligne, pCheckBox)

しかし、このスロットは存在します。ヘッダー ファイルと cpp で次のように宣言します。

void supervision::cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox)

この問題を解決するための私の方法は良いですか? はいの場合、信号をスロットに正しく関連付ける方法と、いいえの場合、続行する方法は?

ありがとうございました。

[編集] : を作成し、qCheckBox動的に関連付ける関数のコードは次のとおりです。

void supervision::ajouterCheckBox(QTableWidget *monTab, int ligne){
    // Creation de la check box
    QWidget *pWidget = new QWidget(); //Creation du widget contenant la checkbox
    QCheckBox *pCheckBox = new QCheckBox(); // Creation de la checkbox
    QHBoxLayout *pLayout = new QHBoxLayout(pWidget); // Layout pour centrer ma checkbox
    pLayout->addWidget(pCheckBox); // Ajout de la check box au layout
    pLayout->setAlignment(Qt::AlignCenter); //Alignement
    pLayout->setContentsMargins(0,0,0,0);//Supression des bordure
    pWidget->setLayout(pLayout);//Mise en place du layout dans le widget
    monTab->setCellWidget(ligne,5,pWidget);//Mise en place du widget contenant la checkbox dans ça cellule

    //Mise en place de la connection
    QObject::connect(pCheckBox, SIGNAL(clicked()),  this, SLOT(cliqueCheckBox(monTab,ligne, pCheckBox)));
}
4

3 に答える 3

1

実際、接続に問題があります。

実際、パラメーターが 0 の信号を 3 つのパラメーターを受け取るスロットに接続すると、うまくいきません。

信号をスロットに接続する場合、署名が一致する必要があります (または、スロットがより少ない引数を取る必要があります)。そうしないと、実行時にエラーが発生します。実際、あなたの場合、スロットはシグナルが送信しない引数を期待しています。

したがって、署名を一致させる方法を見つける必要があります。

編集:追加したコードに関しては、いいえ、接続をパラメーターとして宣言するスコープに存在する変数を使用することはできません。スロットの引数は、関連付けられたシグナルからのみ取得できます。

于 2014-06-17T07:28:22.187 に答える
0

Qtのドキュメントから:

シグナルまたはスロットを含むすべてのクラスは、宣言の先頭に Q_OBJECT を記載する必要があります。また、QObject から (直接的または間接的に) 派生する必要があります。

class X : public QObject 
{ 
    Q_OBJECT
    ...
};

クラス宣言でスロットを宣言する必要があります。

public slots:
    void cliqueCheckBox(QTableWidget *monTab, int ligne, QCheckBox *pCheckBox);

引数にデフォルト値がある場合、SIGNAL() および SLOT() マクロに引数を含めるかどうかに関する規則は、SIGNAL() マクロに渡される署名が、SLOT に渡される署名よりも少ない引数を持ってはならないということです。 () 大きい

于 2014-06-17T07:34:11.987 に答える