1

我在 QT creator 中创建了一个表单mainwindow类,在 menuBar 中创建了一个动作元素,我希望当我们点击它时,它会显示另一个名为DataWindow

这是我的 mainwindow.h

private slots:
    void on_actionNouvellesDonnees_clicked();

这是我的 mainwindow.ccp

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

但是当我调试并单击我的操作菜单时,没有显示 DataWindow ......并且调试工具告诉我:

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();
}

完成主窗口.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();
    }

这会在堆栈上构造一个 DataWindow 对象,显示它,然后离开函数,立即销毁该对象。

    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

看起来您的actionNouvellesDonneesis a QAction,它没有称为 clicked() 的信号。尝试将您的插槽更改为:

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
    }
}

非模态对话框(或窗口)还有第三个选项,但如果您正在寻找,我会让您阅读QDialog 文档。希望我能理解主要思想。

第四个选项是new DataWindow在 MainWindow 构造函数中,然后show/ hideit 在触发槽中。

于 2012-11-12T23:28:57.393 回答