程序运行但没有显示Qt c ++

时间:2014-04-01 15:02:21

标签: c++ qt

我的程序运行时没有错误,但屏幕上没有显示任何内容,弹出一个窗口,运行另一个带有QProcess的程序,此程序运行正常。代码如下:

头文件:

#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秒后最终退出并且没有错误。

1 个答案:

答案 0 :(得分:1)

您的问题是您已经使用来自表单文件(.ui文件)的用户界面。您需要决定使用哪一个。

要修复代码,您需要做的就是删除对Ui命名空间的所有引用。只需删除以下内容:

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

另请注意,此行正在使用null或未定义的指针值 - 您永远不会创建计时器实例:

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"