这是我第一次问堆栈溢出问题。如果您有任何问题的建议,请告诉我。
我对Qt很陌生,在使用事件时遇到一些问题。希望有人能提供任何想法。

背景:

我有我的自定义按钮,在rxPushButtonrx.h中是rx.cpp。我使用on_rxPushButton_clicked更改图像,并且效果很好。
MainWindow中,我需要使用一些rx,所以我包含了类rx,并且我想检测是否按下了鼠标左键,我需要知道按下了哪个rx并记录其ID。在int中的rxId中。

问题:

我尝试了两种实现目标的方法,包括MainWindowmousePressEvent。我发现我无法在任何eventFilter上检测到鼠标按下的信号,但可以在rx内其他位置的rx之外检测到它。我想知道事件是否会发生冲突,但是当我在Mainwindow中注释on_rxPushButton_clicked时,rx.cpp仍然无法解决该问题。因此,我假定MainWindow占据的屏幕空间可能不会受到rx的控制(我可以在我的代码中获得Debug消息“ test1”而不是“ test2”,请检查以下内容)。
如果我同时需要这两个东西(在MainWindow中更改图像并在rx中修改一个变量),应该如何解决该问题?又或者我的代码以及如何修改只是出问题了?

我希望将它们分开,因为将来我仍然需要在MainWindow中包含许多对象。

这是我的一些相关代码:

rx.cpp

void rx::on_rxPushButton_clicked(void)
{
    startLoading();
}

void rx::startLoading(void)
{
    state = 1;
    connect(timer, SIGNAL(timeout()), this, SLOT(loading1()));
    timer->start(LOADING_INTERVAL);
}

void rx::loading1(void)
{
    if(state == 1)
    {
        state = 2;
        ui->rxPushButton->setStyleSheet("border-image: url(:/images/Rx/Rxloading1.png);");
        disconnect(timer, SIGNAL(timeout()), this, SLOT(loading1()));
    }
}


主窗口

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    for(int i = 0 ; i < rxSize ; i++)
    {
        rxList << new rx(this);
        int j = i/rxHorizontalCount;
        rxList[i]->setGeometry(500+(i-j*8)*110,10+j*90,100,90);
    }
    //rxList[0]->installEventFilter(this);
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {
        qDebug() << "test1";
        if(rxList[0]->rect().contains(event->x(), event->y()))
            qDebug() << "test2";
    }
}

最佳答案

在RX中更改图像

使用QSignalMapper类捆绑来自QWidgets的信号(类rx),并使用与发送信号的对象相对应的widget参数(rx类)重新发出信号。
我们将每个按钮的clicked()信号连接到信号映射器的map()插槽,然后在信号映射器中创建从每个按钮到按钮本身的映射。
最后,我们将信号映射器的mapd()信号连接到自定义小部件的(rx对象)clicked()信号。当用户单击按钮时,自定义窗口小部件(rx对象)将发出一个clicked()信号,其参数为用户单击的按钮(rx对象)。
在MainWindow :: slotButtonsClicked(QWidget * p)函数中处理按钮单击事件。

在MainWindow中修改n变量:

您可以在mousePressEvent函数中更新MainWindow的变量

class MainWindow : public QWidget
   {
    public :
        MainWindow (QWidget *parent);

        QSignalMapper * mapper;

    slots:
        void slotButtonsClicked(QWidget *);

    // ...
}

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mapper = new QSignalMapper(this);

    for(int i = 0 ; i < rxSize ; i++)
    {
        rxList << new rx(this);
        int j = i/rxHorizontalCount;
        rxList[i]->setGeometry(500+(i-j*8)*110,10+j*90,100,90);
        QObject::connect(rxList[i], SIGNAL(clicked()),mapper,SLOT(map()));

        //Adds a mapping so that when map() is signalled from the sender, the signal mapped(widget ) is emitted.
        mapper->setMapping(rxList[i], rxList[i]);
    }

    QObject::connect(mapper,SIGNAL(mapped(QWidget *)),this,SLOT(slotButtonsClicked(QWidget *)));
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)
    {
        qDebug() << "Clicked outside the button";

        //Now you can modify n variable in MainWindow
    }

    MainWindow::mousePressEvent(event);
}

void MainWindow::slotButtonsClicked(QWidget *p)
{
    rx *button = dynamic_cast<rx *>(p);
    button->on_rxPushButton_clicked();

    qDebug() << button <<" clicked on button";

    //Now you can change image in rx
}


希望这有效:)

关于c++ - Qt-为什么我不能在MainWindow中为我的自定义按钮触发mousePressEvent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44650953/

10-13 06:30