1

mainwindowQTクリエーターでフォームクラスを作成し、メニューバーでアクション要素を作成しました。それをクリックすると、別のフォームが表示されるようにしたいですDataWindow

これが私のmainwindow.hです

private slots:
    void on_actionNouvellesDonnees_clicked();

これが私のmainwindow.ccpです

void MainWindow::on_actionNouvellesDonnees_clicked() {
    DataWindow w;
    w.show();
}

しかし、デバッグ中にアクション メニューをクリックすると、データウィンドウが表示されず、デバッグ ツールに次のように表示されました。

QMetaObject::connectSlotsByName: No matching signal for on_actionNouvellesDonnees_clicked()

助けてくれてありがとう!

mainwindow.ccp を完成させます:

#include <QtGui/QApplication>
#include <QApplication>
#include <QMessageBox>

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "datawindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //QObject::connect(ui->actionNouvellesDonnees, SIGNAL(triggered()), this, SLOT(on_actionNouvellesDonnees_clicked()));
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_actionNouvellesDonnees_triggered() {

    DataWindow w;
    w.show();
}

mainwindow.h を完成させる

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_actionNouvellesDonnees_triggered();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
4

4 に答える 4

5

使うって言ったでしょ

    void MainWindow::on_actionNouvellesDonnees_clicked() {
        DataWindow w;
        w.show();
    }

これにより、スタック上にデータウィンドウ オブジェクトが作成されて表示され、関数が終了し、オブジェクトがただちに破棄されます。

    void MainWindow::on_actionNouvellesDonnees_clicked() {
        DataWindow *w = new DataWindow;
        w->setAttribute(Qt::WA_DeleteOnClose);
        w->show();
    }

手動でウィンドウを閉じるまで、それを維持する必要があります

于 2012-11-18T01:23:09.803 に答える
1

on_actionNouvellesDonnees_clicked に接続するシグナルはどれですか? アクション (メイン メニューなど) の場合、正しいシグナルが "clicked()" でない場合は、"triggered()" を使用できます。

これを試して

QObject::connect(ui->actionNouvellesDonnees, SIGNAL(triggered()), this, SLOT(on_actionNouvellesDonnees_clicked()));
于 2012-11-12T18:05:41.293 に答える
1

あなたactionNouvellesDonneesQActionclicked() というシグナルを持たない のようです。スロットを次のように変更してみてください。

on_actionNouvellesDonnees_triggered()
于 2012-11-12T18:05:48.580 に答える
1

ここで行うことは、ウィンドウを表示し、スロットのスコープを離れるときにウィンドウを削除することだけです。これを回避するには、何をしようとしているのか、どのようなウィンドウDataWindowが必要なのかに応じて、多くのオプションがあります。

オプション 1 - シンプルなモーダル ダイアログ

ユーザーの即時の注意を必要とするウィンドウをポップアップするだけで、終了するまで他に何も続行できない場合は、ユーザーの入力を待機するモーダル ダイアログを起動します。QDialog::exec()をQDialog::show()に置き換える必要があります。

void MainWindow::on_actionNouvellesDonnees_triggered() {
    DataWindow w;
    int result = w.exec();
    switch(result){
        case QDialog::Ok: //etc
            break;
        case QDialog::Cancel: //etc
            break;
        default: //etc
    }
}

オプション 2 - 複雑なモーダル ダイアログ

このウィンドウが何らかの形で他の関数によって照会される必要がある場合は、それを MainWindow のメンバーにして、アクション中にヒープ上に作成する必要があります。

//MainWindow.h
MainWindow {
public:
    MainWindow();
    ...
protected:
    DataWindow* m_datawin;
    ...
}

//mainwindow.cpp
void MainWindow::MainWindow {
    ...
    m_datawin = 0;
}
void MainWindow::on_actionNouvellesDonnees_triggered() {
    if(m_datawin != 0)
        m_datawin->deleteLater(); //you must delete it somewhere. either delete it in the dtor or at the end of this slot, depending on if you need it outside this scope
    m_datawin = new DataWindow();
    m_datawin->setWindowModality(Qt::WindowModal);
    int result = m_datawin->exec();
    switch(result){
        case QDialog::Ok: //etc
            break;
        case QDialog::Cancel: //etc
            break;
        default: //etc
    }
}

非モーダル ダイアログ (またはウィンドウ) の 3 番目のオプションもありますが、お探しの場合はQDialog のドキュメントをお読みください。うまくいけば、私は主なアイデアを理解しました。

4 番目のオプションはnew DataWindow、MainWindow コンストラクターでto を実行してから、トリガーされたスロットでshow/ it を実行することです。hide

于 2012-11-12T23:28:57.393 に答える