2014-04-01 17 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

Похоже, что вы использовали конструктор для настройки графического интерфейса пользователя (через интерфейс пользователя файл). Если да, то почему вы вручную меняете элементы ui в виджета :: SetupGui(), они не настраиваются автоматически в 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 очень малы.

Вот как мог выглядеть ваш код. Я поместил все это в один файл, чтобы он был коротким. Очевидно, вам это не нужно в одном файле. Я также сделал интерфейс более совместимым с обычными ожиданиями. Например. элементы управления, с которыми невозможно взаимодействовать, должны быть отключены.

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

Смежные вопросы