2016-09-24 13 views
0

タブをダブルクリックしてラベルを変更するにはどうすればよいですか? 好ましくは、ラベルを編集することができますが、別の入力ボックスから文字列を取得することもできます。助言がありますか? タブが追加され、現在指定されたラベルが好き:ダブルクリックでQTabWidgetのlabelプロパティを変更するにはどうすればよいですか?

QString tab_label = QString("Shell (") + QString::number(session->id(), 16) + ")"; 
    addTab(session->widget(), tab_label); 

を、私は作成後にラベルを編集できるようにしたいと思います。

ああ、私もQtの初心者だと言わなければならない!

EDIT1
フル方法:

int SessionStack::addSession(Session::SessionType type) 
{ 
    Session* session = new Session(type, this); 
    connect(session, SIGNAL(titleChanged(int,QString)), this, SIGNAL(titleChanged(int,QString))); 
    connect(session, SIGNAL(terminalManuallyActivated(Terminal*)), this, SLOT(handleManualTerminalActivation(Terminal*))); 
    connect(session, SIGNAL(activityDetected(Terminal*)), m_window, SLOT(handleTerminalActivity(Terminal*))); 
    connect(session, SIGNAL(silenceDetected(Terminal*)), m_window, SLOT(handleTerminalSilence(Terminal*))); 
    connect(session, SIGNAL(destroyed(int)), this, SLOT(cleanup(int))); 

    m_sessions.insert(session->id(), session); 

    QString tab_label = QString("Shell (") + QString::number(session->id(), 16) + ")"; 
    addTab(session->widget(), tab_label); 

    emit sessionAdded(session->id()); 

    raiseSession(session->id()); 

    return session->id(); 
} 

答えて

2

QTabBar :: tabBarDoubleClicked信号があります、あなただけのダブルクリックを検出するためのスロットに接続する必要があります。また、実際にタブのテキストを編集するにはウィジェットが必要です。あなたはより多くのに従って、または必要がありますいくつかのインプレース変更をしたいの代わり場合

connect(tabWidget->tabBar(), &QTabBar::tabBarDoubleClicked, 
     this, MyWidget::editTabBarLabel); 

void MyWidget::editTabBarLabel(int tabIndex) 
{ 
    if (tabIndex < 0) 
     return; 
    // open dialog asking for the new label, 
    // f.i. via QInputDialog::getText 

    // set the new label bakc 
} 

:あなたは(たとえば、ダイアログを開く)「場違い」それをしたい場合、のような何かを行うのに十分でなければなりませんそれほど頻繁にQTabBarを変更しないでください。

最も簡単なオプションは、右のタブでQLineEditを開くことです。 QTabBar:.tabrectを使ってタブのジオメトリを取得すると、同じジオメトリにライン編集を配置できます。そのパスでは不足している可能性があります(下を参照)。QTabBarをサブクラス化して、指定されたタブにinitStyleOptionを使用し、ラインディジットのジオメトリを右のサブウイルトに設定する必要があります(たとえば、タブの)。

ランダム擬似braindumpedコード:

void MyTabBar::editTabBarLabel(int tabIndex) 
{ 
    if (tabIndex < 0) 
     return; 

    if (!m_lineEdit) { 
     m_lineEdit = new QLineEdit(this); 
     // once done, commit the change, or abort it, anyhow 
     // destroy/hide (?) the line edit 
     connect(m_lineEdit, &QLineEdit::editingFinished, 
       this, &MyTabBar::renameLabel); 
    } else { 
     // we're actually editing something else, what to do? 
     // commit the other change and start editing here? 
    } 

    m_editedTabIndex = tabIndex; // remember which one we're editing 
    m_lineEdit->setText(tabText(tabIndex));  

    // not "entirely" accurate, you need better subrect control here, 
    // cf. QStyle and https://doc.qt.io/qt-5/style-reference.html#widget-walkthrough 
    // that's why this should really be a QTabBar subclass, because 
    // you'll need to invoke initStyleOption and then fetch the subrects from the style 

    m_lineEdit->setGeometry(tabRect(tabIndex)); 
    m_lineEdit->show(); 
} 

// also track resize of the tabbar, relayout, tab reorder, tab insertion and removal, etc. 
// move the QLineEdit accordingly 
+0

こんにちは、私は 'tabWidget->'(接続 'で()')は何か思ったんだけど...?私は** EDIT1の**元のポストにセッションとタブを追加するメソッドからコードを追加しました** – cerr

+0

あなたが周りに持っているQTabWidgetです。 – peppe

関連する問題