2012-09-27 57 views
0

我正在用QtCreator创建一个小应用程序。它编译,但从QtCreator执行时,我得到“该程序已经无法完成”的错误。Qt程序不起作用:该程序已经无法完成

如果我试图执行从控制台的二进制文件,我得到一个Segementation故障(核心转储)。

因为这是我第一次我自己开始Qt代码,我想我失去了一些东西。请检查下面的代码:

页眉mainwindow.h:

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

class MainWindow; 
class QLabel; 
class QLineEdit; 
class QPushButton; 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    void createGUI(); 

private: 
    QLineEdit *mysqlUserLineEdit; 
    QLineEdit *mysqlPasswordLineEdit; 
    QLineEdit *albatrossIPLineEdit; 
    QLineEdit *albatrossPortLineEdit; 
    QPushButton *exitButton; 
    QPushButton *startButton; 
}; 

#endif // MAINWINDOW_H 

来源mainwindow.cpp:

#include <QtGui> 
#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    createGUI(); 

    //connect(...) 
    //connect(...) 

    setWindowTitle(tr("Albatross MySQL simulator")); 
} 

MainWindow::~MainWindow() 
{ 

} 

void MainWindow::createGUI() 
{ 
    QVBoxLayout *mainLayout = new QVBoxLayout; 
     QHBoxLayout *settingsLayout = new QHBoxLayout; 
      QVBoxLayout *mysqlSettingsLayout = new QVBoxLayout; 
       QHBoxLayout *mysqlUserLayout = new QHBoxLayout; 
       mysqlUserLineEdit = new QLineEdit(); 
       QLabel *mysqlUserLabel = new QLabel(tr("&User:")); 
       mysqlUserLabel->setBuddy(mysqlUserLineEdit); 
       mysqlUserLayout->addWidget(mysqlUserLabel); 
       mysqlUserLayout->addWidget(mysqlUserLineEdit); 

       QHBoxLayout *mysqlPasswordLayout = new QHBoxLayout; 
       mysqlPasswordLineEdit = new QLineEdit(); 
       QLabel *mysqlPasswordLabel = new QLabel(tr("&Password:")); 
       mysqlPasswordLabel->setBuddy(mysqlPasswordLineEdit); 
       mysqlPasswordLayout->addWidget(mysqlPasswordLabel); 
       mysqlPasswordLayout->addWidget(mysqlPasswordLineEdit); 
      mysqlSettingsLayout->addLayout(mysqlUserLayout); 
      mysqlSettingsLayout->addLayout(mysqlPasswordLayout); 

      QVBoxLayout *networkSettingsLayout = new QVBoxLayout; 
       QHBoxLayout *albatrossIPLayout = new QHBoxLayout; 
       albatrossIPLineEdit = new QLineEdit(); 
       QLabel *albatrossIPLabel = new QLabel(tr("&IP:")); 
       albatrossIPLabel->setBuddy(albatrossIPLineEdit); 
       albatrossIPLayout->addWidget(albatrossIPLabel); 
       albatrossIPLayout->addWidget(albatrossIPLineEdit); 

       QHBoxLayout *albatrossPortLayout = new QHBoxLayout; 
       albatrossPortLineEdit = new QLineEdit(); 
       QLabel *albatrossPortLabel = new QLabel(tr("P&ort:")); 
       albatrossPortLabel->setBuddy(albatrossPortLineEdit); 
       albatrossPortLayout->addWidget(albatrossPortLabel); 
       albatrossPortLayout->addWidget(albatrossPortLineEdit); 
      networkSettingsLayout->addLayout(albatrossIPLayout); 
      networkSettingsLayout->addLayout(albatrossPortLayout); 
     settingsLayout->addLayout(mysqlSettingsLayout); 
     settingsLayout->addLayout(networkSettingsLayout); 

     QHBoxLayout *buttonsLayout = new QHBoxLayout; 
     exitButton = new QPushButton(tr("&Exit")); 
     buttonsLayout->addWidget(exitButton); 
     startButton = new QPushButton(tr("&Start")); 
     startButton->setDefault(true); 
     buttonsLayout->addWidget(startButton); 
    mainLayout->addLayout(settingsLayout); 
    mainLayout->addLayout(buttonsLayout); 
    centralWidget()->setLayout(mainLayout); 
} 

最后的main.cpp ,,这与QtCreator自动生成:

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

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

    return a.exec(); 
} 

编辑:好吧,使用mainLayout时,将其附加到主窗口中,而这个问题是mainwindow.cpp的最后一行。这就是抛出分段错误的地方。我应该如何设置中央部件?或者是否有任何其他方式将布局附加到主窗口小部件?

+2

有趣的代码格式... – SingerOfTheFall

+0

@SingerOfTheFall这是为什么?请评论,我很高兴得知如果我做错了 –

+0

1.在第一行设置断点; 2.以调试模式运行程序; 3.一行一行地遍历你的程序,并找出哪一行seg。遇到了错误,我敢打赌://连接,据我所知,将小部件连接到需要的插槽 –

回答

1

一般而言,创作者中的这种行为是由于SEGFAULT或缺少的库引起的。

您的代码

  mysqlPasswordLabel->setBuddy(mysqlPasswordLineEdit); 
      mysqlPasswordLayout->addWidget(mysqlPasswordLabel); 
      mysqlPasswordLayout->addWidget(mysqlPasswordLineEdit); 

是原因。你不初始化mysqlPasswordLineEdit导致段错误

+0

好吧,我不初始化任何QLineEdits的变得有点混乱。但仍然不起作用。我也改变了setWay(mainLayout)为centralWidget() - > setLayout(mainLayout)。查看更改 –