2012-11-12 41 views
1

我创建了Qt Creator的形式mainwindow类,并在菜单栏的动作元素的其它形式,我想,当我们点击它时,它表现出其他形式的所谓DataWindow显示,从主要形式的Qt C++

这里是我的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 

回答

1

哪些信号你连接on_actionNouvellesDonnees_clicked?如果它是一个动作(如在主菜单中)正确的信号不是“点击()”,则可以使用“triggered()”。

试试这个

QObject::connect(ui->actionNouvellesDonnees, SIGNAL(triggered()), this, SLOT(on_actionNouvellesDonnees_clicked())); 
+0

哦好,谢谢!但是表单刚刚出现并关闭,为什么? – Random78952

+0

您在堆栈中创建了窗口,并在其销毁的函数的末尾创建了窗口。你可以创建一个堆或更好的窗口,将其定义为一个类成员。 – bmeric

+0

我不明白...你能让我成为一个混帐的例子吗? – Random78952

1

它看起来像你的actionNouvellesDonneesQAction,它不具有信号称为点击()。试着改变你的插槽为:

on_actionNouvellesDonnees_triggered() 
+0

噢,好的,谢谢它的工作原理!但是表单刚刚出现并关闭,为什么? – Random78952

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.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 documentation如果这就是你要找的内容。希望我能得到主要想法。

第四个选项是在主窗口构造函数中new DataWindow,然后show/hide它在触发槽中。

4

你说你使用

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

应该保持它活着,直到您手动关闭此窗口它也能工作

+0

整洁的小功能。我以前没有注意过那个。 – Phlucious