0

私のアプリケーションと私の質問の簡単な説明:

QTabWidget には、それぞれ 2 つの QRadioButton を含む複数の groupBox があります。例 Select Menu (groupBox): (RadioButton:) A (RadioButton:) B

ある時点でアクティブにできるメニューは 1 つだけです。両方の radioButton がそれぞれに接続されています -> radioButton A をクリックして true に設定すると、radioButton B は自動的に false に設定されます - そしてその逆です。

メニュー設定を変更しようとすると、クリック信号が発せられる前に、QMessageBox 警告「メニューを変更してもよろしいですか?これにより、デバイスに重大な損傷が生じる可能性があります。」を発行したいと考えています。-はい・いいえ。

[はい] をクリックすると、メニューの設定を変更します。いいえをクリックすると、すべてが以前のままになります。

唯一の問題は、on_radio_button_toggled スロットで QMessageBox を発行すると、radioButton の状態が既に true に変更されていることです。スロットの状態を再度変更して修正しても、ポップアップ メッセージが表示された時点で状態が変更されているように見えます。メニューの状態が既に変更されていることを意味するため、これは望ましくありません。

ラジオボタンをクリックしたときに、実際の信号スロットを放出する前に QMessageBox をどこで、またはどのようにポップアップさせることができますか?

ご助力ありがとうございます。

更新: 推奨どおりに eventFilter を実装しました。ここに私のソースコードがあります:

ui->radioButtonMenu1->installEventFilter(this);
ui->radioButtonMenu2->installEventFilter(this);

SubmenuOne は QWidget です。QTabWidget (プレースホルダー経由) によって MainWindow に統合されます。

bool SubmenuOne::eventFilter(QObject *obj, QEvent *event)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMessageBox::StandardButton reply;
reply= QMessageBox::question(this,tr("WARNING"),tr("Changing the settings   may cause severe damage to your device! Please confirm your decision."),QMessageBox::Yes|QMessageBox::No);

if (reply == QMessageBox::Yes)
{

//QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
   //keyEvent->accept();
   //event->accept();
   qDebug("Yes.");
    return false;
}
else
{
    qDebug("No.");

     return true;
}

}
}
4

1 に答える 1

0

bool eventFilter(QObject *obj, QEvent *event);ウィンドウで Declare イベント フィルタを使用し、次のようにすべてのラジオボタンにイベント フィルタをインストールする必要がありますradioButton1->installEventFilter(this);。次に、eventFilter で event type:if (event->type() == QEvent::MouseButtonPress)を確認し、QMessageBox. その後、ユーザーの選択に応じて、イベントを受け入れて戻ることができますtruefalse

bool SubmenuOne::eventFilter(QObject *obj, QEvent *event)
{
  if(event->type() == QEvent::MouseButtonPress)
  {
    QMessageBox::StandardButton reply;
    reply= QMessageBox::question(this,tr("WARNING"),tr("Changing the settings   may cause severe damage to your device! Please confirm your decision."),QMessageBox::Yes|QMessageBox::No);

    if (reply == QMessageBox::Yes)
    {
        static_cast<QRadioButton*>(obj)->setChecked(True);
    }
    event->accepted();
    return true;
  }
  return QMainWindow::eventFilter(obj, event); //you forget this. QMainWindow is just base class of your SubmenuOne.
}
于 2016-01-07T20:14:46.447 に答える