2

wxGrid を並べ替えようとしています。現在、ドキュメントによると、並べ替えはサポートされていませんが、イベントは生成されるとのことです。このドキュメントは、イベントが呼び出されていることを示していますwxEVT_GRID_COL_SORT。けっこうだ!

さて、問題は、イベントを機能させる方法がわからないことです。フレームのイベント テーブルは次のようになります。

BEGIN_EVENT_TABLE(MainWindow, wxFrame)
EVT_BUTTON(XRCID("toevoegknop"), MainWindow::openAddWindow)
// A few other events that work
END_EVENT_TABLE()

そこにリストされているイベントは、すでに完全に正常に機能しています。MainWindow クラスで関数を宣言しました。

void sortColumn(wxGridEvent& event);

wxEVT_GRID_COL_SORT今、私はそのイベントを追加したいと思います。私の観点からすると、ドキュメンテーションは私が何をすべきかについてあまり明確ではないので、イベントテーブルに次の行を追加してイベントを追加しようとしました.

wxEVT_GRID_COL_SORT(MainWindow::sortColumn)

構文エラーが発生するため、正しくありません。他のイベントが EVT で始まったばかりであることに気付いたので、wx を削除しようとしましたが、まだ運が悪いです。

インターネットを広く検索すると、フレームのコンストラクター (私の場合は MainWindow) に次の行を追加してイベントを処理するペーストビンの投稿にたどり着きました。

Grid->Connect(wxEVT_GRID_COL_SORT,(wxObjectEventFunction)&Frame::OnGridColSort);

私はこのように適応しました(MainWindowのほぼ全体のコンストラクター)

MainWindow::MainWindow(const wxString& title, const wxPoint& pos, const wxSize& size, Collection* library, MovieDB* database)
: wxFrame(), library_(library), database_(database) {
wxXmlResource::Get()->LoadFrame(this, NULL, _T("hoofdvenster"));

SetSize(size);
grid_ = (wxGrid *)FindWindowById(XRCID("filmtabel"));
// Irrelevant code removed, setting up the grid labels etc.

grid_->Connect(wxEVT_GRID_COL_SORT,(wxObjectEventFunction)&MainWindow::sortColumn);
}

エラーが発生します:

'wxEVT_GRID_COL_SORT' はこのスコープで宣言されていません

だから今、私は他に何を試すことができるのかわかりません。私は数日前に wxWidgets をいじり始めたばかりなので、wxWidgets ユーザーにとって些細なことは私には向いていないかもしれないことを覚えておいてください。

前もって感謝します!

4

1 に答える 1

3

wx 2.8.12を実装していないを使用しているようですwxEVT_GRID_COL_SORT。追加されたwx 2.9ため、使用するには最新の開発リリース ( 2.9.4) を取得する必要があります。

ただし、イベントをエミュレートするために、それに応じてイベントwx 2.8を処理およびディスパッチできます。wxEVT_GRID_LABEL_LEFT_CLICK

イベントをイベント マップに追加するか、

EVT_GRID_CMD_LABEL_LEFT_CLICK(ID_GRID,Frame::OnGridLabelLeftClick)

またはコンストラクターで接続します。

grid->Connect(wxEVT_GRID_LABEL_LEFT_CLICK,
    (wxObjectEventFunction)&Frame::OnGridLabelLeftClick);
void Frame::OnGridColSort(wxGridEvent& event) {}
void Frame::OnGridRowSort(wxGridEvent& event) {}

void Frame::OnGridLabelLeftClick(wxGridEvent& event) {
    // GetCol and GetRow will return the index of the col/row label clicked
    event.Skip(); // the next handler will select col/row/everything, based
                  // on the label clicked; remove to prevent selection
    if( event.GetCol() >= 0 )
        OnGridColSort(event);
    else if( event.GetRow() >= 0 )
        OnGridRowSort(event);
    else
        ; // if both are -1, the upper left corner was clicked (select all)
}

これは と同様に動作しEVT_GRID_COL_SORTます。

于 2012-12-27T03:44:59.863 に答える