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

Program runs but nothing displays Qt c++

本文关键字:显示 Qt 运行 程序      更新时间:2023-10-16
嗨,我的程序运行

没有错误,但屏幕上没有显示任何内容,弹出一个窗口,该窗口使用 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

小部件.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;
}

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

您的问题是您已经在使用来自表单文件(.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"