-1

QWidget に基づく QtCreator にプロジェクト「Cybaware_ver1」があり、すべて正常に動作していました。パブリック変数とプライベート変数および関数を含むクラスのヘッダー ファイルがあります。しかし、ある日、ヘッダーファイルで新しい変数を宣言しようとすると、「int」変数であっても、プロジェクトを実行すると、

The program has unexpectedly finished.
/home/devdeep/Cybaware_ver1-build-Desktop_Qt_5_0_0_GCC_64bit_SDK-Debug/Cybaware_ver1       exited with code 0

以前は、問題なくヘッダー ファイルに変数を追加できました。現在、新しい機能を追加したり、UI を変更したりできます。ヘッダー ファイルに変数を追加することはできません。これらの変数を cpp ファイルで static として宣言する一時的な解決策を見つけました。ただし、これに対する解決策を見つけたいと思います。Qt を再インストールしようとしましたが、問題は解決しません。Ubuntu Linuxで実行しています。これを修正する方法があれば教えてください。また、他にどのような情報を提供できるかわかりません。それで、それについて教えてください。

更新:わかりました。デバッガーを使用すると、エラーはセグメンテーション違反であると表示されます。これは、qdebug.h の次のセクションと、qt_message_output でマークされた行を指しています。

public:
inline QDebug(QIODevice *device) : stream(new Stream(device)) {}
inline QDebug(QString *string) : stream(new Stream(string)) {}
inline QDebug(QtMsgType t) : stream(new Stream(t)) {}
inline QDebug(const QDebug &o):stream(o.stream) { ++stream->ref; }
inline QDebug &operator=(const QDebug &other);
inline ~QDebug() {
    if (!--stream->ref) {
        if(stream->message_output) {
            QT_TRY {
                qt_message_output(stream->type,
                                  stream->context,
                                  stream->buffer);
            } QT_CATCH(std::bad_alloc&) { /* We're out of memory - give up. */ }
        }
        delete stream;
    }
}

メモリ不足エラーだと思います。他のプログラムを閉じると解決する可能性がありますか?

UPDATE2:「run qmake」を呼び出しても解決しませんでした。これが私のヘッダーファイルです:

#ifndef MAINVIEW_H
#define MAINVIEW_H

#include <QWidget>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsLineItem>
#include <QGraphicsEllipseItem>
#include <QGraphicsSimpleTextItem>
#include <list>
#include <QMouseEvent>
#include <QEvent>
#include <QString>
#include <boost/thread.hpp>
#include <qcustomplot.h>
#include <QTimer>
namespace Ui {
class MainView; 
}

class MainView : public QWidget
{
Q_OBJECT

public:
int num_missions;
int num_services;
int timer;


int* num_servpermission;
int missionstartx;
//boost::thread pt;
QGraphicsScene mynewscene;
QGraphicsRectItem* myrect;
QGraphicsRectItem** missionline;
QGraphicsLineItem** missionplayline;
QGraphicsRectItem** playrect;
std::list<QGraphicsLineItem**> missionticks;
std::list<QGraphicsEllipseItem**> missionservices;
std::list<QGraphicsSimpleTextItem**> missionservicesno;
std::list<QGraphicsLineItem**>::iterator ti;
std::list<QGraphicsSimpleTextItem**>::iterator ssi;
//std::list<QGraphicsEllipseItem**>::iterator si;

int* missionlength;
int** missionplayxy;
int* missiontickscount;
int* missioniteration;
int missionselected;
int missiontickselected;
int missiontickoffset;
bool isrepeated;

int temp;


QCustomPlot** customPlot;
QTimer dataTimer;

explicit MainView(QWidget *parent = 0);
void playthread();

bool eventFilter(QObject*, QEvent*);
void testfunc();
void clearview();
void test1();

~MainView();

private slots:
void on_startButton_clicked();
void realtimeDataPlot();

void on_pushButton_clicked();

private:
Ui::MainView *ui;



};


#endif // MAINVIEW_H

変数を追加すると、プログラムがクラッシュします。たとえば、先ほど変数int tempを追加したところ、クラッシュしました。宣言std::list::iterator si ;のコメントを外すなど、何か新しいものを追加するとクラッシュします。私はそれを取り出し、すべてが正常に動作します。

UPDATE3: 私の外部ヘッダー ファイル qcustomplot.h は同じディレクトリにあります。私もブーストを使用していますが、apt-get を使用してセットアップしました。スタック トレースは次のとおりです。

0 MainView::playthread mainview.cpp 530 0x418fa1
1 ブースト::_mfi::mf0::operator() mem_fn_template.hpp 49 0x424690
2 ブースト::_bi::list1 >::operator()、ブースト::_bi::list0 > bind.hpp 253 0x424600
3 ブースト::_bi::bind_t、ブースト::_bi::list1 > >::operator() bind_template.hpp 20 0x4245af
4 ブースト::詳細::スレッドデータ、ブースト::_bi::list1 > > >::run thread.hpp 61 0x42431c
5 thread_proxy /usr/lib/libboost_thread.so.1.46.1 0x7ffff7bcfba9
6 start_thread /lib/x86_64-linux-gnu/libpthread.so.0 0x7ffff6557efc
7 clone /lib/x86_64- linux-gnu/libc.so.6 0x7ffff5af159d
8 ??

上記のトレースの 0 番目のポイントは、ui->missionview->invalidateScene() を指しています。ここで、ブースト スレッドにバインドされた関数playthreadからグラフィックス ビューが更新されます。しかし、cpp ファイルのどこにも変数を使用していないため、ヘッダー ファイルに変数を追加する際にこれが問題になる理由がわかりません。

4

2 に答える 2

0

これが問題の原因かどうかはわかりませんが、ヘッダーに QObject 派生クラスが含まれている場合は、qmakeを実行してからアプリケーションをビルドする必要があります。

LE: また、そうでない場合は、もう少しコード (Qt コードではなく、あなたのコード) を示すことをお勧めします。

于 2013-02-02T17:18:53.887 に答える