c++ - Qt - 为什么我不能在 MainWindow 中为我的自定义按钮触发 mousePressEvent

标签 c++ qt

这是我第一次在 Stack Overflow 上提问。如果有任何关于提问的建议,请告诉我。 我是 Qt 的新手,在使用事件时遇到了一些问题。希望有人能提供任何想法。

背景:

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

问题:

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

我希望尽可能将它们分开,因为我以后还需要在 MainWindow 中包含很多对象。

下面是我的一些相关代码:

接收.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()));
    }
}

主窗口.cpp

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)的信号,并使用与发送信号的对象相对应的小部件(类 rx)参数重新发射它们。 我们将每个按钮的 clicked() 信号连接到信号映射器的 map() 插槽,并在信号映射器中创建从每个按钮到按钮本身的映射。 最后,我们将信号映射器的 mapped() 信号连接到自定义小部件(rx 对象)的 clicked() 信号。当用户单击按钮时,自定义小部件(rx 对象)将发出一个 clicked() 信号,其参数是用户单击的按钮(rx 对象)。 在 MainWindow::slotButtonsClicked(QWidget *p) 函数中处理按钮点击事件。

修改主窗口中的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/

相关文章:

c++ - C++:如何使用正则表达式从字符串中提取单词

c++ - 错误 C2731 : 'wWinMain' : function cannot be overloaded

c++ - 将 Qt 模型/ View 与非表格数据和非表格/列表 UI 一起使用?

c++ - 有没有办法取消 GLFW 中的 60 fps 上限?

C++ while 循环和 for 循环不起作用

c++ - OpenCV 角点检测返回空角 vector

c++ - Qt检查外部进程是否崩溃

c++ - 如何将数字 QString 转换为 int 数组?

c++ - Qt显示/显示/提升窗口的正确方法

c++ - 在 Cocoa/Objective-C 项目中包含 C++ 代码时出现未知类型名称 'class'