在PyQt5中获取滚动条滑块的大小/宽度?

时间:2019-01-27 18:38:21

标签: python pyqt pyqt5 qscrollbar

说,您有一个PyQt5滚动条:

pyqt5scrollbar

我想以编程方式找到滚动条“拇指”的宽度(在http://pyqt.sourceforge.net/Docs/PyQt4/qscrollbar.html中称为“滑块”)及其位置;我想像素一开始将是“自然”单位。

根据上图,我猜start始终为0-但我可以吗?如果可以,如何获取leftright,{{1} }(尽管,如果我们有widthleft,则right只是width);和right-left以像素为单位?

我知道存在end的{​​{1}},QScrollBar.value(),但是我无法真正分辨它们是否与上述像素尺寸有关。 / p>

(如果滚动条需要一个PyQt5示例,请参见例如我在Have tabs keep focus on mousewheel over them in a PyQt5 scrollarea?中发布的代码)

1 个答案:

答案 0 :(得分:3)

在这种情况下,必须使用QStyle()的subControlRect()方法来获取可以从中获取所需信息的矩形。

在下面的示例中,我创建了QScrollBar的自定义类,每当滑块的位置更改或更改QScrollBar的大小时,该类便通过信号发出该信息。

#include <iostream>
#include <ctime>
#include <random>
#include <iomanip>
#include <cstdlib>


using namespace std;


class Blackjack
{
 public:
   Blackjack();
   void playGame();
   int pbalance;
   int betamount;
   int loop= 1;
   int *playerbalances;
   int pbalan,pbal;
   void firstbalance();
   void clearhand();



 private:
   int dhandSize;
   int phandSize;
   int dhandSum;
   int phandSum;
   int phit;
   int pstand;
   bool playerDone;
   bool dealerDone;
   void addPlayerCard();
   void addDealerCard();
   void printHand();
   void sumHands();
   void playerbalance();
   void playerbet();
   int *dhand[];
   int *phand[];
};

Blackjack::Blackjack()
{
   srand(time(0));
   dhandSize = 0;
   phandSize = 0;
   dhandSum = 0;
   phandSum = 0;
   playerDone = false;
   dealerDone = false;
}


void Blackjack::playGame()
{

   if (pbal>0)
   {

      // Start the player and dealer with two cards
      playerbet();
      addPlayerCard();
      addPlayerCard();
      addDealerCard();
      addDealerCard();
      sumHands();
      printHand();

      if (dhandSum == 21)
      {
         cout << "Dealer has blackjack. Dealer wins.\n";
         clearhand();
         return;
      }
      else if (phandSum == 21)
      {
         cout << "Player has blackjack. Player wins.\n";
         clearhand();
         return;
      }

      while (dealerDone == false || playerDone == false)
      {
         if (playerDone == false)
         {
            cout << "Would you like to hit? (1 - Yes, 2 - No)\n";
            cin >> phit;

            if (phit == 1)
            {
               addPlayerCard();
               printHand();
               sumHands();

               if (phandSum > 21)
               {
                  cout << "Player's hand exceeded 21. Player loses"<<endl;
                  pbalan =(pbalan - betamount);
                  cout <<"[you lose $"<<betamount<<" of money!]"<<endl;
                  cout <<"[your current balance is: $"<<pbalan<<"]"<<endl;
                  clearhand();
                  return;
               }
            }
         }

         if (playerDone == false)
         {
            cout << "Would you like to stand? (1 - Yes, 2 - No)\n";
            cin >> pstand;
         }

         if (pstand == 1)
         {
            playerDone = true;
         }

         if (dhandSum < 17 && dealerDone != true)
         {
            addDealerCard();
            printHand();
            sumHands();

            if (dhandSum > 21)
            {
               cout << "Dealer hand exceeded 21. Dealer loses.\n";
               return;
            }
         }
         else if (dhandSum >= 17)
         {
            dealerDone = true;
         }

         if (phandSum == 21 && dhandSum == 21)
         {
            cout << "Push, player and dealer reached 21.\n";
            return;
         }
         else if (phandSum == 21)
         {
            cout << "Player reached 21. Player wins.\n";
            return;
         }
         else if (dhandSum == 21)
         {
            cout << "Dealer reached 21. Dealer wins.\n";
            pbalan =(pbalan - betamount);
            cout <<"[you lose $"<<betamount<<" of money!]"<<endl;
            cout <<"[your current balance is: $"<<pbalan<<"]"<<endl;
            return;
         }

         if ((playerDone == true && dealerDone == true) || (phandSize == 5 && phandSize == 5))
         {
            if (dhandSum < phandSum)
            {
               cout << "Sum of your hand exceeds the dealer's sum of " << dhandSum << "! You win!";
               return;
            }
            else if (phandSum == dhandSum)
            {
               cout << "Dealer sum of " << dhandSum << " is equal to the sum of your hand. Tie game.";
               return;
            }
            else if (dhandSum > phandSum)
            {
               cout << "Sum of your hand is lower than the dealer's sum of " << dhandSum << ". You lose!"<<endl;
               pbalan =(pbalan - betamount);
               cout <<"[you lose $"<<betamount<<" of money!]"<<endl;
               cout <<"[your current balance is: $"<<pbalan<<"]"<<endl;
               return;
            }
         }
      }
   }
}


void Blackjack::clearhand()
{
   for (int i = 0; i < dhandSize; i++) { delete dhand[i]; }
   for (int i = 0; i < phandSize; i++) { delete phand[i]; }
   phandSize = 0;
   dhandSize = 0;
}

void Blackjack::firstbalance()
{

   cout << "Welcome to Blackjack" <<endl;
   cout << "please enter a starting balance: " <<endl;
   cin >> pbal;
   playerbalances  = &pbalan;
   *playerbalances  = pbal;

}

void Blackjack::playerbet()
{
   cout << "how much do you want to bet?"<<endl;
   cin >> betamount;
}

void Blackjack::addPlayerCard()
{
   if (phandSize <= 5)
   {

      *phand[phandSize] = 1 + (rand() % 13);
      phandSize++;
   }
   else
   {
      cout << "Sorry. You have reached the maximum number of cards (5)." << endl;
      playerDone = true;
   }
}
void Blackjack::addDealerCard()
{
   if (dhandSize <= 5)
   {
      *dhand[dhandSize] = 1 + (rand() % 13);
      dhandSize++;
   }
   else
   {
      dealerDone = true;
   }
}

void Blackjack::printHand()
{
   cout << "Your current hand is...\n";

   for (int i = 0; i < phandSize; i++)
   {
      cout << "    -" << *phand[i] << "-    \n\n";
   }

   cout << "Dealer's current hand is...\n";

   for (int j = 0; j < dhandSize; j++)
   {
      cout << "    -" << *dhand[j] << "-    \n\n";
   }
}

void Blackjack::sumHands()
{
   dhandSum = 0;
   phandSum = 0;
   for (int i = 0; i < dhandSize; i++)
   {
      dhandSum += *dhand[i];
   }

   for (int j = 0; j < phandSize; j++)
   {
      phandSum += *phand[j];
   }

   cout << "Current player hand sum is: " << phandSum << endl;
}


using namespace std;

int main()
{

   int exitGame = 1;
   int i = 0;

   Blackjack play;

   if (i<1)
   {
      play.firstbalance();
      i++;
   }

   do
   {

      play.playGame();
      play.clearhand();
      cout << "\nWould you like to play again? (1 - Yes, 2 - No)\n";
      cin >> exitGame;
   }
   while (exitGame == 1);


   cout << "\nThanks for playing!\n";
   return 0;
}