如何在Qt

时间:2017-04-03 12:45:50

标签: c++ qt

所以我开始学习Qt,并掌握了Qt5 C ++ GUI Programming Cookbook。我想制作一个简单的视频转换器,并且有一个关于如何在书中做到这一点的例子。

但是执行书中的代码会给我一个错误:

'Ui::MainWindow' has no member named 'filePath'
     ui->filePath->setText(fileName);
         ^

所以我想我必须将filePath添加到MainWindow,但由于我是Qt和C ++的新手,我不知道该怎么做。

这是mainwindow.h

#include <QMainWindow>
#include <QFileDialog>
#include <QProcess>
#include <QMessageBox>
#include <QScrollBar>
#include <QDebug>
#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();
    QProcess* process;
    QString outputText;
    QString fileName;
    QString outputFileName;

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();
    void processStarted();
    void readyReadStandardOutput();
    void processFinished();
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    process = new QProcess(this);
    connect(process, SIGNAL(started()), this,
    SLOT(processStarted()));
    connect(process,SIGNAL(readyReadStandardOutput()),
    this,SLOT(readyReadStandardOutput()));
    connect(process, SIGNAL(finished(int)), this,
    SLOT(processFinished()));

}

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

void MainWindow::on_pushButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, "OpenVideo", "", "Video Files (*.avi *.mp4 *.mov)");
    ui->filePath->setText(fileName);
}

void MainWindow::on_pushButton_2_clicked()
{
    QString ffmpeg = "C:/FFmpeg/bin/ffmpeg";
    QStringList arguments;
    fileName = ui->filePath->text();
    if (fileName != "")
    {
        QFileInfo fileInfo = QFile(fileName);
        outputFileName = fileInfo.patch() + "/" + fileInfo.completeBaseName();

        if (QFile::exists(fileName))
        {
            //0-AVI
            //1-MP4
            //2-MOV
            int format = ui -> fileFormat-> currentIndex();
            if (format ==0)
            {
                outputFileName += ".avi";
            }
            else if (format ==1)
            {
                outputFileName += ".mp4";
            }
            else if (format ==2)
            {
                outputFileName += ".mov";
            }
            qDebug()<<outputFileName<<format;
            arguments<< "-i"<<fileName<<outputFileName;
            qDebug()<<arguments;

            process->setProcessChannelMode(QProcess::MergedChannels);
            process->start(ffmpeg,arguments);
         }
         else
         {
            QMessageBox::warning(this,"Failed", "Failed to open video file.");
         }
      else
      {
           QMessageBox::warning(this,"Failed", "Failed to open video file.");
      }

    }
}
void MainWindow::processStarted()
{
qDebug() << "Process started.";
ui->browseButton->setEnabled(false);
ui->fileFormat->setEditable(false);
ui->convertButton->setEnabled(false);
}
void MainWindow::readyReadStandardOutput()
{
outputText += process->readAllStandardOutput();
ui->outputDisplay->setText(outputText);
ui->outputDisplay->verticalScrollBar()->setSliderPosition(ui->outputDisplay->verticalScrollBar()->maximum());
}
void MainWindow::processFinished()
{
qDebug() << "Process finished.";
if (QFile::exists(outputFileName))
{
QMessageBox::information(this, "Success", "Videosuccessfully converted.");
}
else
{
QMessageBox::information(this, "Failed", "Failed to convertvideo.");
}
ui->browseButton->setEnabled(true);
ui->fileFormat->setEditable(true);

和mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>404</width>
    <height>334</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QLineEdit" name="lineEdit">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>30</y>
      <width>281</width>
      <height>21</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton">
    <property name="text">
     <string>Browse</string>
    </property>
   </widget>
   <widget class="QComboBox" name="comboBox">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>60</y>
      <width>371</width>
      <height>22</height>
     </rect>
    </property>
    <item>
     <property name="text">
      <string>AVI</string>
     </property>
    </item>
    <item>
     <property name="text">
      <string>MP4</string>
     </property>
    </item>
    <item>
     <property name="text">
      <string>MOV</string>
     </property>
    </item>
   </widget>
   <widget class="QTextEdit" name="textEdit">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>100</y>
      <width>371</width>
      <height>141</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton_2">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>250</y>
      <width>371</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>Convert</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>404</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

2 个答案:

答案 0 :(得分:2)

错误发生在.ui文件中,您需要打开Designer,单击“filePath”,然后将其名称更改为filePath。目前它是'textEdit'。

通过设计器应用程序放在ui文件中的所有可视控件都应该与您在C ++代码中使用的名称相匹配。

答案 1 :(得分:1)

您的代码有很多错误,这些错误是由名称生成的,我已经更正了完整的代码:

mainwindow.h

#include <QMainWindow>
#include <QFileDialog>
#include <QProcess>
#include <QMessageBox>
#include <QScrollBar>
#include <QDebug>
#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();
    QProcess* process;
    QString outputText;
    QString fileName;
    QString outputFileName;

private slots:
    void on_browseButton_clicked();

    void on_convertButton_clicked();
    void processStarted();
    void readyReadStandardOutput();
    void processFinished();
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    process = new QProcess(this);
    connect(process, SIGNAL(started()), this,
            SLOT(processStarted()));
    connect(process,SIGNAL(readyReadStandardOutput()),
            this,SLOT(readyReadStandardOutput()));
    connect(process, SIGNAL(finished(int)), this,
            SLOT(processFinished()));

}

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

void MainWindow::on_browseButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(this, "OpenVideo", "", "Video Files (*.avi *.mp4 *.mov)");
    ui->filePath->setText(fileName);
}

void MainWindow::on_convertButton_clicked()
{
    QString ffmpeg = "C:/FFmpeg/bin/ffmpeg";
    QStringList arguments;
    fileName = ui->filePath->text();
    if (fileName != "")
    {
        QFileInfo fileInfo = QFile(fileName);

        outputFileName = fileInfo.path() + "/" + fileInfo.completeBaseName();

        if (QFile::exists(fileName))
        {
            //0-AVI
            //1-MP4
            //2-MOV
            int format = ui -> fileFormat-> currentIndex();
            if (format ==0)
            {
                outputFileName += ".avi";
            }
            else if (format ==1)
            {
                outputFileName += ".mp4";
            }
            else if (format ==2)
            {
                outputFileName += ".mov";
            }
            qDebug()<<outputFileName<<format;
            arguments<< "-i"<<fileName<<outputFileName;
            qDebug()<<arguments;

            process->setProcessChannelMode(QProcess::MergedChannels);
            process->start(ffmpeg,arguments);
        }
        else
        {
            QMessageBox::warning(this,"Failed", "Failed to open video file.");
        }

    }
}

void MainWindow::processStarted()
{
    qDebug() << "Process started.";
    ui->browseButton->setEnabled(false);
    ui->fileFormat->setEditable(false);
    ui->convertButton->setEnabled(false);
}
void MainWindow::readyReadStandardOutput()
{
    outputText += process->readAllStandardOutput();
    ui->outputDisplay->setText(outputText);
    ui->outputDisplay->verticalScrollBar()->setSliderPosition(ui->outputDisplay->verticalScrollBar()->maximum());
}
void MainWindow::processFinished()
{
    qDebug() << "Process finished.";
    if (QFile::exists(outputFileName))
    {
        QMessageBox::information(this, "Success", "Videosuccessfully converted.");
    }
    else
    {
        QMessageBox::information(this, "Failed", "Failed to convertvideo.");
    }
    ui->browseButton->setEnabled(true);
    ui->fileFormat->setEditable(true);

}

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>404</width>
    <height>334</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QLineEdit" name="filePath">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>30</y>
      <width>281</width>
      <height>21</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="browseButton">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
      <width>80</width>
      <height>22</height>
     </rect>
    </property>
    <property name="text">
     <string>Browse</string>
    </property>
   </widget>
   <widget class="QComboBox" name="fileFormat">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>60</y>
      <width>371</width>
      <height>22</height>
     </rect>
    </property>
    <item>
     <property name="text">
      <string>AVI</string>
     </property>
    </item>
    <item>
     <property name="text">
      <string>MP4</string>
     </property>
    </item>
    <item>
     <property name="text">
      <string>MOV</string>
     </property>
    </item>
   </widget>
   <widget class="QTextEdit" name="outputDisplay">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>100</y>
      <width>371</width>
      <height>141</height>
     </rect>
    </property>
   </widget>
   <widget class="QPushButton" name="convertButton">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>250</y>
      <width>371</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text">
     <string>Convert</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>404</width>
     <height>19</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>