2013-02-25 3 views
1

Je veux implémenter quelque chose de similaire à Ruban UI trouvé dans MS Office 2007. J'utilise QPushbutton et QStacked Widget. Lorsqu'un QPushbutton est pressé, widget de Stacked Widget est affiché. Je veux mettre en œuvre de telle sorte que quand un PushButton est enfoncé nous ne devrions pas être en mesure d'appuyer à nouveau sauf si un autre QPushButton est pressé. Donc pour le clicked()SLOT de mon QPushButton J'appelle ceci: button->setDown(true); dans ma 1ère ligne. Selon la documentation:Bug possible dans QPushbutton?

Si cette propriété est true, le bouton est enfoncé. Les signaux pressed() et clicked() ne sont pas émis si vous définissez cette propriété sur true.

Ainsi, lorsque je clique dessus au moment de l'exécution, le bouton est affiché comme enfoncé. C'est bon! Cependant, les SIGNAL sont toujours émis, c'est-à-dire que pressed() & clicked() sont émis. J'ai essayé pour la même propriété en utilisant différentes combinaisons de SIGNAL & SLOT. Cependant c'est juste pareil. J'utilise Qt 4.8.1. Qu'est-ce qui ne va pas ici? Merci.

+1

On dirait que vous voulez vraiment désactiver le contrôle? – paulm

+0

s'il doit rester en bas il devrait être vérifiable aussi (ou vous aurez juste un bouton avec l'aspect visuel d'un pressé ...) –

+0

@Adriano Je veux l'aspect visuel d'être enfoncé oui. Je veux aussi qu'il ne devrait pas émettre les signaux mentionnés ci-dessus selon la documentation. En ce qui concerne checkable, je pense que QPushButton n'a pas cette propriété? Corrigez-moi si je me trompe ... –

Répondre

3

Si vous souhaitez définir l'apparence visuelle du bouton sur en appuyant sur, vous pouvez utiliser la fonction setDown(). La documentation n'est pas très claire mais:

Si cette propriété est true, le bouton est enfoncé. Les signaux pressed() et clicked() ne sont pas émis si vous définissez cette propriété sur true.

Cela ne signifie pas que que les signaux ne seront pas émis en le bouton est pressé mais ils ne seront pas émis lorsque vous appelez setDown() (après tout le bouton est activé et une 2ème cliquez peut simplement basculer son état).

Ce que vous pouvez faire est de vérifier si le bouton est enfoncé (isDown()) à l'intérieur de votre gestionnaire pour clicked(). Comme alternative vous pouvez changer le bouton pour être vérifiable (avec setCheckable())): le 2ème clic sur le bouton le «fermera» (si c'est le comportement dont vous avez besoin).

+0

Je ne sais pas ce que vous entendez par "Cela ne signifie pas que les signaux ne seront pas émis lorsque le bouton est enfoncé mais qu'ils ne seront pas émis lorsque vous appellerez setDown() (après que tous les boutons soient activés et 2ème clic peut simplement basculer son état). " Quand un bouton est pressé la 1ère fois, évidemment le SIGNAL doit être émis. Mais chaque pression après cela ne devrait pas donner de SIGNAL parce que j'appelle setDown() dans le SLOT quand le bouton est pressé la 1ère fois. –

+0

Désolé pour mon mauvais anglais, je vais essayer d'expliquer mieux: imaginez la documentation ne dit pas cela. D'accord? Eh bien, appelez maintenant setDown (true). On peut s'attendre à ce qu'au moins le signal pressé() soit émis car le bouton a changé d'état. Maintenant, remettez cette phrase dans la documentation. Vous appelez setDown (true) mais pressé() n'est pas émis (** pour cet appel **). –

+1

Cela signifie que même si setDown() change l'état du bouton, les ** signaux correspondants ne seront pas émis suite à l'appel de setDown() **. Cela ne signifie pas que cela va désactiver ces signaux. –

0

réglé tous les boutons à checkable puis lire sur

http://qt-project.org/doc/qt-4.8/qbuttongroup.html

+0

Merci beaucoup! C'est exactement ce que je voulais pour mon exigence de faire Ribon UI. –

+0

s'il vous plaît upvote si vous aimez la solution :) – cppguy

+0

Je l'ai déjà fait! Peut-être que quelqu'un a voté votre réponse :) Que puis-je faire pour cela? Peut-être que vous pourriez demander aux modérateurs qui ont voté votre réponse ... –