2012-11-12 83 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