2014-04-01 39 views
0

大家好,我的程序沒有錯誤的運行,但沒有顯示在屏幕上,一個窗口是爲了彈出它運行一個QProcess中另一個程序,該程序運行正常。代碼如下:程序運行,但沒有顯示Qt的C++

頭文件:

#ifndef WIDGET_H 
#define WIDGET_H 

#include <QWidget> 
#include <QtGui> 
#include <QTimer> 

namespace Ui { 
    class Widget; 
} 

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit Widget(QWidget *parent = 0); 
    ~Widget(); 
private slots: 
    void setTimer(); 
    void displayAdvice(); 
    void cancelTimer(); 
    void addAdvice(); 
    void processDone(int); 
private: 
    QLabel* timerLbl; 
    QLineEdit* timerEdt; 
    QTextEdit* adviceEdt; 
    QPushButton* okBtn; 
    QPushButton* cancelBtn; 
    QTimer* timer; 
    QProcess *process; 
    void setupGui(); 


private: 
    Ui::Widget *ui; 
}; 

#endif // WIDGET_H 

widget.cpp

#include "widget.h" 
#include "ui_widget.h" 

Widget::Widget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::Widget) 
{ 
    ui->setupUi(this); 
    setupGui(); 
} 

Widget::~Widget() 
{ 
    delete ui; 
} 

void Widget::setupGui() 
{ 
    timerLbl = new QLabel("Timer set interval in seconds"); 
    timerEdt = new QLineEdit(); 
    adviceEdt = new QTextEdit(); 
    this->adviceEdt->setReadOnly(true); 
    okBtn = new QPushButton("OK"); 
    cancelBtn = new QPushButton("Cancel"); 
    QVBoxLayout* layout = new QVBoxLayout(); 
    layout->addWidget(timerLbl); 
    layout->addWidget(timerEdt); 
    layout->addWidget(okBtn); 
    layout->addWidget(adviceEdt); 
    layout->addWidget(cancelBtn); 
    this->setWindowTitle("Advice"); 
    this->setLayout(layout); 

    connect(okBtn,SIGNAL(clicked()), this, SLOT(setTimer())); 
    connect(cancelBtn, SIGNAL(clicked()), this, SLOT(cancelTimer())); 
    connect(timer, SIGNAL(timeout()),this, SLOT(displayAdvice())); 

} 

void Widget::setTimer() 
{ 
    timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()),this, SLOT(cancelTimer())); 
    QString setting = this->timerEdt->text(); 
    bool ok; 
    int set = setting.toInt(&ok,10); 
    set = set * 1000; 
    timer->setInterval(set); 
    timer->start(); 
    timerEdt->setReadOnly(true); 
    okBtn->setDown(true); 
} 

void Widget::cancelTimer() 
{ 
    timer->stop(); 
    adviceEdt->clear(); 
    okBtn->setDown(false); 
    timerEdt->clear(); 
    timerEdt->setReadOnly(false); 
} 

void Widget::displayAdvice() 
{ 
    process = new QProcess(this); 
    process->start("C:/Users/Dmon/Desktop/47039949 COS3711 Assignment 2/Question 4/Ass2Q4Part1-build-desktop/debug/Ass2Q4Part1.exe"); 
    connect(process, SIGNAL(readyReadStandardOutput()),this, SLOT(addAdvice())); 
    connect(process, SIGNAL(finished(int)),this, SLOT(processDone(int))); 
} 

void Widget::addAdvice() 
{ 
    QByteArray data = process->readAllStandardOutput(); 
    QString strToWrite = data; 
    this->adviceEdt->clear(); 
    this->adviceEdt->append(strToWrite); 
} 

void Widget::processDone(int) 
{ 
    process->close(); 
    process->deleteLater(); 
    process=0; 
} 

的main.cpp

#include <QtGui/QApplication> 
#include "widget.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Widget w; 
    w.show(); 

    return a.exec(); 
} 

程序運行與當時顯示的最終一無所知後,沒有錯誤退出15秒。

+0

也許你應該嘗試調試它,看看它爲什麼停止本身 –

+1

看起來你已經使用設計器設置你的GUI(通過UI文件)。如果是這樣,你爲什麼手動改變widget :: SetupGui()中的UI元素,是不是在ui-> setupUi(this)中自動設置它們?我強烈懷疑你初始化gui兩次 - 一次手動,一次通過自動生成的代碼。 –

+0

@Joachim Pileborg'Ui :: Widget'類通常在Qt中使用.ui格式文件生成的另一個文件中定義。沒關係。 –

回答

1

你的問題是,你已經在使用的用戶界面從表單文件(.ui文件)的到來。你需要決定你想使用哪一個。

要解決你的代碼,你需要做的就是刪除對Ui命名空間的所有引用。只需刪除下面:

namespace Ui { 
    class Widget; 
} 
// 
private: 
    Ui::Widget *ui; 
// 
#include "ui_widget.h" 
// 
delete ui; 

而且,請注意,這條線正在與空或未定義的指針值 - 你永遠不創建定時器實例:

connect(timer, SIGNAL(timeout()),this, SLOT(displayAdvice())); 

最後,沒有任何理由分配堆上的成員小部件。事實上,它確實浪費了一些堆內存,因爲QWidget實例非常小。

下面是您的代碼的外觀。我把它放在一個文件中,以保持簡短。你顯然不需要它在一個單一的文件。我也讓UI更加符合平常的期望。例如。應禁用無法與之交互的控件。

// main.cpp 
#include <QApplication> 
#include <QtWidgets> 
#include <QTimer> 

class Widget : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit Widget(QWidget *parent = 0); 
private slots: 
    void setTimer(); 
    void displayAdvice(); 
    void cancelTimer(); 
    void addAdvice(); 
    void processDone(int); 
private: 
    QLabel m_timerLbl; 
    QLineEdit m_timerEdt; 
    QTextEdit m_adviceEdt; 
    QPushButton m_okBtn; 
    QPushButton m_cancelBtn; 
    QTimer m_timer; 
    QProcess m_process; 
    void setupGui(); 
}; 

Widget::Widget(QWidget *parent) : 
    QWidget(parent) 
{ 
    setupGui(); 
} 

void Widget::setupGui() 
{ 
    m_timerLbl.setText("Timer set interval in seconds"); 
    m_adviceEdt.setReadOnly(true); 
    m_okBtn.setText("OK"); 
    m_cancelBtn.setText("Cancel"); 
    m_cancelBtn.setEnabled(false); 
    QVBoxLayout* layout = new QVBoxLayout(this); 
    layout->addWidget(&m_timerLbl); 
    layout->addWidget(&m_timerEdt); 
    layout->addWidget(&m_okBtn); 
    layout->addWidget(&m_adviceEdt); 
    layout->addWidget(&m_cancelBtn); 
    setWindowTitle("Advice"); 

    connect(&m_okBtn, SIGNAL(clicked()), SLOT(setTimer())); 
    connect(&m_cancelBtn, SIGNAL(clicked()), SLOT(cancelTimer())); 
    connect(&m_timer, SIGNAL(timeout()), SLOT(displayAdvice())); 
    connect(&m_timer, SIGNAL(timeout()), SLOT(cancelTimer())); 

    connect(&m_process, SIGNAL(readyReadStandardOutput()), SLOT(addAdvice())); 
    connect(&m_process, SIGNAL(finished(int)), SLOT(processDone(int))); 
} 

void Widget::setTimer() 
{ 
    QString const setting = m_timerEdt.text(); 
    bool ok; 
    int set = setting.toInt(&ok,10) * 1000; 
    m_timer.setInterval(set); 
    m_timer.start(); 
    m_timerEdt.setEnabled(false); 
    m_okBtn.setEnabled(false); 
    m_cancelBtn.setEnabled(true); 
} 

void Widget::cancelTimer() 
{ 
    m_timer.stop(); 
    m_adviceEdt.clear(); 
    m_timerEdt.clear(); 
    m_okBtn.setEnabled(true); 
    m_timerEdt.setEnabled(true); 
    m_cancelBtn.setEnabled(false); 
} 

void Widget::displayAdvice() 
{ 
    m_process.start("bash", QStringList() << "-c" << "echo 'Hello!'"); 
#if 0 
    m_process.start(QDir::homePath() + 
        "/Desktop/47039949 COS3711 Assignment 2/Question 4/Ass2Q4Part1-build-desktop/debug/Ass2Q4Part1.exe"); 
#endif 
} 

void Widget::addAdvice() 
{ 
    QByteArray const data = m_process.readAllStandardOutput(); 
    m_adviceEdt.setPlainText(QString::fromLocal8Bit(data)); 
} 

void Widget::processDone(int) 
{ 
    m_process.close(); 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Widget w; 
    w.show(); 
    return a.exec(); 
} 

#include "main.moc" 
+0

非常感謝所有的幫助,現在作品:D – Dmon