这是我第一次在 Stack Overflow 上提问。如果有任何关于提问的建议,请告诉我。 我是 Qt 的新手,在使用事件时遇到了一些问题。希望有人能提供任何想法。
背景:
我有我的自定义按钮,它是 rx.h
和 rx.cpp
中的 rxPushButton
。我使用 on_rxPushButton_clicked
更改图像,效果很好。
在 MainWindow
中,我需要使用一些 rx
所以我包含了类 rx
并且我想检测我是否按下了鼠标左键,我需要知道按下了哪个 rx
并将其 id 记录在 MainWindow
的 int
rxId
中。
问题:
我尝试了两种方法来实现我的目标,包括mousePressEvent
和eventFilter
。我发现我无法在任何 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/